Основная проблема в том, что ваша функция возвращает адрес локальной переменной.Эта локальная переменная больше не существует после возврата из функции, поэтому любой указатель на нее недействителен.
Чтобы исправить некоторые проблемы с вашим кодом, я добавил #include <stdio.h>
в начало (требуется для printf
)и изменил ваш printf
вызов с
printf("%i", (createArray(10)));
на
printf("%p\n", (void*)createArray(10));
Когда я компилирую с помощью gcc и запускаю программу, вывод:
(nil)
Это означает, что ваша функция возвращает нулевой указатель.(Это не «указатель на ноль»; указатель равен ноль.) Это не то, что я ожидал;Я ожидал неверное значение указателя мусора.(Когда я использую tcc вместо gcc, я получаю 0x7fffd95a7140
.)
Очевидно, что gcc распознает, что ваш код имеет неопределенное поведение, и заменяет оператор return
эквивалентом return NULL;
.Это совершенно законное преобразование (и оно может помешать вашей программе делать что-то неприятное с недействительным указателем, изменяя память, которой ваша программа не владеет).
Итог: ваша программа имеет неопределенное поведение, и выне могу предположить, что он будет делать.И да, выделение массива с использованием malloc
и возврат адреса выделенного массива - один из способов исправить это.