Здесь есть несколько неправильных вещей.
Первое и самое очевидное, вы возвращаете result
, который является массивом (но распадается на указатель на массив), который расположен в стеке в функциипоэтому он возвращается, когда функция возвращается.Вам необходимо динамически распределить массив (и полагаться на вызывающего * free
it):
String *result = malloc(10 * sizeof(String));
Кроме того, ваше условие для остановки цикла while
:
if(index == sizeof(result))
Выпустит цикл до тех пор, пока index
не станет 40
(если char*
равно 4 байтам на вашей платформе), потому что sizeof
возвращает размер операнда в байтах, а не элементов массива, поэтому sizeof(result)
есть (опять же,зависит от платформы) 40. Это, очевидно, выходит за пределы массива.
Если бы вы все еще использовали локальный массив вместо malloc
, вы могли бы изменить его на
if (index == sizeof(result) / sizeof(*result))
ОднакоВы не можете сделать это сейчас, потому что result
является только указателем вместо массива, а sizeof(result)
всегда будет размером указателя на вашей платформе.
Вы можете просто удалить это if
полностью и измените условие while
на
while (param && index < 10)
, что гарантирует, что param
не NULL
, а также что index
меньше 10. Вы должны рассмотреть вопрос о #define
илиconst int
или что-то для размера массива и используйте его вместо магиичисло.
Вам также нужно изменить
memset(result,NULL,10);
на
memset(result,NULL, sizeof(String) * 10);
Поскольку, если вы этого не сделаете, memset
устанавливает только первые 10 байтовпамять указала от result
до 0 вместо целого, потому что она принимает число в байтах, а не элементы массива.