Вам не хватает #include <string.h>
в вашем коде.Пожалуйста, попробуйте это - я уверен, что это сработает.Причина в том, что без #include <string.h>
нет прототипа для strndup()
в области видимости, поэтому компилятор предполагает, что strndup()
возвращает int
и принимает неопределенное количество параметров.Это явно неправильно.(Я предполагаю, что вы компилируете в режиме POSIX-совместимого, поэтому вам доступен strndup()
.)
По этой причине всегда полезно компилировать код с включенными предупреждениями.
Если ваша проблема не устраняется даже после изменения, возможно, есть ошибка.
Редактировать : похоже, может возникнуть проблема с strndup()
в AIX:Кажется, проблема в сломанной функции strnlen()
в AIX.Если даже после #include <string.h>
вы видите проблему, скорее всего, вы видите ошибку.A Поиск Google показывает длинный список результатов по этому поводу.
Редактировать 2 :
Можете ли вы попробовать следующую программу и опубликовать результаты?
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *test1 = "abcdefghijabcdefghijabcdefghijk";
char *test2 = "012345678901234567890123456789";
char *control = "01234567890123456789012345678";
char *verify;
free(strndup(test1, 30));
verify = strndup(test2, 29); /* shorter then first strndup !!! */
fprintf(stderr,">%s<\n",verify);
if (strcmp(control, verify))
printf("strndup is broken\n");
}
(взято из https://bugzilla.samba.org/show_bug.cgi?id=1097#c10.)
Редактировать 3 : после просмотра вашего вывода, которое составляет >01234567890123456789012345678<
, и без strndup is broken
, яне думайте, что ваша версия AIX содержит ошибку strndup
.
Скорее всего, вы где-то повреждаете память (учитывая тот факт, что проблема возникает только в большой программе при определенных условиях).маленький, полный, компилируемый пример, который демонстрирует проблему повреждения стека? В противном случае вам придется отлаживать выделение / освобождение памяти в вашей программе. Есть много программ, которые помогут вам сделать это, таких как valgrind , glibc mcheck , dmalloc , электрический забор и т. Д.