Всегда включайте предупреждения и читайте их.
Когда я компилирую ваш код (после добавления отсутствующей точки с запятой в main
), используя "g ++ -std = c11 -Wall -Wextra *.c -o main ", я получаю много предупреждений о неявных объявлениях функций и преобразованиях целых чисел в указатели, начиная с:
main.c: In function ‘main’:
main.c:9:20: warning: implicit declaration of function ‘myMalloc’; did you mean ‘malloc’? [-Wimplicit-function-declaration]
#define malloc myMalloc
^
main.c:24:25: note: in expansion of macro ‘malloc’
char * x = (char *) malloc(16);
^~~~~~
main.c:24:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
char * x = (char *) malloc(16);
^
В C89, когда вызывается функция, которая не была объявлена,C неявно предполагал объявление функции, подобное extern int func_name();
, но если определение функции фактически не использует возвращаемый тип, совместимый с int
, поведение было неопределенным.Вызов функции, которая не была объявлена, является некорректным с C99, но gcc разрешает это в любом случае со старым правилом и предупреждением, даже если указана более новая версия Standard.
Так что, вероятно, происходит то, что компиляторв какой-то момент предполагается, что ваши функции, которые на самом деле возвращают указатели, возвращают значения int
, в результате чего используются только некоторые биты значений.
Поэтому убедитесь, что объявление каждой вызываемой функции является видимым, обычно путем записи ивключая правильные заголовки.