我有将列表转换为数组的函数:
void* list_to_array(SList* list)
{
int i;
int array_size = list_get_length(list);
void* array[array_size];
for (i = 0; i < array_size; i++)
{
array[i] = list_get_n_data(list,i);
}
return *array;
}
但是当我尝试测试它时:
int* a = (int*)list_to_array(list);
printf("%d" (int)a);
没关系。我看到第一个元素。但是当我尝试获取第二个或第三个元素时:
int* a = (int*)list_to_array(list);
a++;
printf("%d" (int)a);
我看到第一个元素 + 4。如果我尝试获取第三个元素,我看到第一个元素值 + 8 等等...为什么?怎么了?
谢谢
最佳答案
您正在返回指向堆栈内存位置的指针。一旦函数返回,该内存区域就不再有效。
此外,您返回的不是实际返回数组的指针,而是数组中的第一个元素。以下代码将返回 1,而不是数组的指针。
int array[] {1, 2, 3, 4};
return *array
您可能只需要对代码进行最少的更改即可使其正常工作。
void** array = (void **) malloc(sizeof(void *) * array_size);
...
return array;
只需确保在使用完array
时释放内存。
void **array = list_to_array(list);
// Use array
...
// Finished with array
free(array);
关于将列表转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3513626/