我基本上做的是
现在,当我在Caller函数中访问此内存时,没有错误。
但是如果我在分配后尝试在被调用的函数中访问它。
我试图了解这里发生了什么,或者我错过了什么。
#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);
}
}
答案 0 :(得分:3)
您正在访问它。
被调用函数中的访问权限为
(*ppData)[i].a = (i+1)*10;
(*ppData)
= Data_t*
变量。
现在我们分配了3个内存。我们正在访问它们。每个都包含我们正在访问它们的结构元素。 (.a
或.b
)等。
每当你感到困惑时,请一步一步考虑。
就像这里假设您正确分配它一样。现在想想*ppData
是什么?它的类型为Data_t*
。
现在认为您在名为*ppData
的变量中有ptr
。
那么如果你已经为ptr
分配了什么,你现在做了什么?您可以像这样访问它
ptr[i] --> i-th allocated memory
如果您认为ptr[i]
的类型为Data_t
,会发生什么情况。所以你可以像这样访问它的元素
ptr[i].a
或ptr[i].b
等。
现在我们只在*ppData
完成了这项工作。