【发布时间】:2020-04-01 04:41:55
【问题描述】:
我需要实现一个包含 void 指针的可变长度数据数组。我遇到了一个问题,当尝试从这个数组打印时,我总是输出最后一个元素。 这是我的问题和尝试实现的抽象说明:
#include <stdio.h>
#include <stdlib.h>
int main() {
int capacity = 4; // for example
void **array = malloc(capacity*sizeof(void*));
// assign values to array elements
for(int i = 0; i < capacity; i++) {
array[i] = malloc(sizeof(void*)); // not sure if it necessary
int a = i*i;
array[i] = &a;
printf("index: %d, element: %d\n", i, *(int*)array[i]); // for demonstration
}
printf("\n");
/*
* after that I try to print all the elements of the array sequentially
*/
for(int i = 0; i < capacity; i++) {
printf("index: %d, element: %d\n", i, *(int*)array[i]));
}
// I know that I do not free my memory, but that’s not the point
return 0;
}
我得到的输出如下:
index: 0, element: 0
index: 1, element: 1
index: 2, element: 4
index: 3, element: 9
index: 0, element: 9
index: 1, element: 9
index: 2, element: 9
index: 3, element: 9
(编辑问题:在 cmets 中,他们向我指出错误在于将变量放入质量中,因为我没有考虑 for 循环中变量的生命周期和指针原理) 如何在不引入一堆额外变量的情况下正确填充类似的数组?还是我选择的方法完全不正确? 如果有任何帮助,我将不胜感激
【问题讨论】:
-
array[i] = &a;存储指向循环本地变量的指针 - 循环结束后,您的数组中有很多悬空指针 -
请阅读更多关于变量的范围和lifetime。
-
还想一想
array[i] = ...后跟array[i] = ...的真正作用。 -
好。谢谢。这意味着我误解了程序显示的本质,我的错误不在输出中,而是将元素放入数组中。我怎样才能做到正确?将项目保存到另一个数组然后指向它?
标签: c arrays stdout void-pointers