gpt4 book ai didi

c - 从被调用函数访问 malloc'ed struct array 给出 Segmentation Fault

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:55 25 4
gpt4 key购买 nike

我主要做的是

  • 将指向结构的指针传递给函数并
  • 然后被调用的函数通过 malloc 为其分配内存。

现在当我在 Caller 函数中访问这段内存时没有错误。

但是,如果我在分配后尝试在被调用函数中访问相同的内容。

  • 访问数组的第一个索引没有错误
  • 但是当我尝试访问该数组的下一个索引时,它给出了段错误

我想了解这里发生了什么,或者我是否遗漏了什么。

Try it Online result

#include <stdio.h>
#include <stdlib.h>

typedef struct _Data
{
int a;
int b;
int c;
} Data_t;

void update(Data_t** ppData)
{
int i;

*ppData = malloc(3 * sizeof(Data_t));
if(*ppData == 0)
{
puts("Error malloc\n");
}
printf("2:Addr = %u %u\n", &ppData, ppData);

#if 1
for(i=0; i < 3; i++)
{
ppData[i]->a = (i+1)*10;
ppData[i]->b = (i+1)*20;
ppData[i]->c = (i+1)*30;

printf("3:[%d] %d %d %d\n", i, ppData[i]->a, ppData[i]->b, ppData[i]->c);
}
#endif
}

int main()
{
Data_t* data;
int i = 0;

printf("1:Addr = %u %u\n", &data, data);

update(&data);

printf("2:Addr = %u %u\n", &data, data);
#if 0
for(i=0; i < 3; i++)
{
data[i].a = (i+1)*10;
data[i].b = (i+1)*20;
data[i].c = (i+1)*30;

printf("4:[%d] %d %d %d\n", i, data[i].a, data[i].b, data[i].c);
}
#endif
for(i=0; i < 3; i++)
{
printf("5:[%d] %d %d %d\n", i, data[i].a, data[i].b, data[i].c);
}
}

最佳答案

您访问的全是错误的。

被调用函数中的访问将是

 (*ppData)[i].a = (i+1)*10;

(*ppData) = Data_t* 变量。

现在我们分配了3 block 内存。我们正在访问它们。每个都包含我们正在访问它们的结构元素。 (.a.b) 等

每当您遇到这样的困惑时,请逐步考虑。

像这里假设你正确分配了它。现在想想什么是*ppData?它是 Data_t* 类型。

现在假设您在名为 ptr 的变量中拥有 *ppData

那么,如果您已经为 ptr 分配了一些内容,您现在要做什么?你这样访问它

ptr[i] --> i-th allocated memory

如果您认为 ptr[i]Data_t 类型会发生什么。所以你像这样访问它的元素

ptr[i].aptr[i].b

现在我们在这里做了同样的事情,只是现在我们在 *ppData 上做了。

关于c - 从被调用函数访问 malloc'ed struct array 给出 Segmentation Fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486851/

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