从被调用函数访问malloc< struct struct array会产生Segmentation Fault

时间:2017-11-25 14:05:52

标签: c arrays memory heap-memory

我基本上做的是

  • 将指向struct的指针传递给函数
  • 被调用的函数然后通过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);
    }
}

1 个答案:

答案 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].aptr[i].b等。

现在我们只在*ppData完成了这项工作。