У вас есть три проблемы здесь.Первый тривиален, вы возвращаете первый элемент массива с return *array
, когда вы имеете в виду возвращать указатель на первый элемент массива с return array
.НЕ ОСТАНАВЛИВАЙТЕСЬ ЗДЕСЬ!Во-вторых, вы увеличиваете указатель на 1, а не на размер данных, на которые вы указываете.Это приведет к неправильным результатам.Третья проблема гораздо серьезнее:
Вы выделяете память для вашего массива в этой строке:
void* array[array_size];
Эта память выделяется в стеке, и эта память больше не выделяется, когда вы возвращаетесь изфункция.При последующем обращении к этой памяти строкой:
int* a = (int*)list_to_array(list);
a указывает на область в стеке, которая больше не используется.Вы получаете несколько разумных результатов с имеющимся у вас кодом, но если вы измените стек после возврата из своей функции, a будет указывать на новую память.Например, если вы используете следующий код:
int* a = (int*)list_to_array(list1);
int* b = (int*)list_to_array(list2);
printf("%d" (int)a);
Вы (вероятно) увидите первый элемент b.Это не гарантировано - вы также можете получить ошибку сегментации.Другой код между присваиванием a
и его использованием также перезапишет содержимое памяти, к которой вы обращаетесь в вашем выражении printf.
Вы должны выделить вашу память с той же областью, что и.
// Prototype
void* list_to_array(SList* list, void* dest_array);
// C99 (Or use malloc)
void* array[list_get_length(list)];
int* a = (int*)list_to_array(list, array);
other_functions();
// Works every time!
printf("%d" (int)a);
Менее серьезная проблема заключается в том, что вы не увеличиваете указатель на правильную величину.Вам нужно использовать оператор sizeof ().Кроме того, вы можете получить доступ к элементам массива с помощью [].
int* a = (int*)list_to_array(list, array);
printf("%d" a[1]); //Prints second element of a
a += sizeof(int) * 2;
printf("%d" (int)a); //Prints third element of a