gpt4 book ai didi

c - 从 void 双指针数组输出 void 指针

转载 作者:行者123 更新时间:2023-11-30 14:33:38 28 4
gpt4 key购买 nike

我需要实现一个包含空指针的可变长度数据数组。我遇到了一个问题,当尝试从这个数组打印时,我总是输出最后一个元素。这是我的问题和尝试实现的抽象说明:

#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

(编辑问题:在评论中,他们向我指出错误在于将变量放入质量中的方式,因为我没有考虑 for 循环中变量的生命周期和指针原理)如何在不引入一堆额外变量的情况下正确填充类似的数组?还是我选择的方法完全错误?如果有任何帮助,我将不胜感激

最佳答案

您会看到“最后一个元素”,因为 a 在每次迭代中都保留在堆栈的相同位置,因此 &a 将该特定的单个地址存储到所有元素中。然后该地址包含最后写入的值 - 直到当其他任何内容覆盖它时它变成完全垃圾。

您将需要不同的地址,因此您需要在循环内为每个数字分配内存。已经发生了哪种情况,只需为 void* 分配内存,而您需要一个 int,然后覆盖它,这(正如注释已经指出的那样)你根本不应该这样做:

array[i] = malloc(sizeof(int));
*(int*)array[i] = i*i;
printf("index: %d, element: %d\n", i, *(int*)array[i]); // for demonstration

然后就可以了:https://ideone.com/dF4KY8 (额外的 ) 已从末尾删除)
当然,正如您自己的评论所暗示的那样,您需要 free() 东西。

关于c - 从 void 双指针数组输出 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225825/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com