【问题标题】:Accessing malloc'ed struct array from called function gives Segmentation Fault从被调用函数访问 malloc 的结构数组会产生分段错误
【发布时间】:2018-05-09 06:29:08
【问题描述】:

我基本上在做的是

  • 将指向结构的指针传递给函数并
  • 然后被调用的函数通过 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;
  • 输出错误信息时,应该输出到stderr,而不是stdout 当错误条件来自系统函数时,还应该输出指示系统为什么认为错误的文本发生了。建议使用:perror( "malloc failed" );,这将满足这两个要求。
  • 当出现无法恢复的错误时,例如调用malloc()失败,然后通过perror()显示错误信息后,如有必要应“清理”,退出程序.发布的代码继续执行程序,就好像对malloc() 的调用成功。
  • 一般来说,以“_”开头后跟大写字母的名称和/或以“_t”结尾的名称是为系统“保留”的,因此“不应”由用户生成程序。
  • 发布的代码包含几个“神奇”数字。 “魔术”数字是没有基础的数字。 IE。 3、10、20、30。“神奇”数字使代码更难理解、调试等。建议使用enum 语句或#define 语句为这些“神奇”数字赋予有意义的名称,然后使用那些整个代码中有意义的名称。

标签: c arrays memory heap-memory


【解决方案1】:

您完全错误地访问它。

被调用函数的访问权限是

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

(*ppData) = Data_t* 变量。

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

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

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

现在想想你在一个名为ptr的变量中拥有*ppData

如果你给ptr 分配了一些东西,你现在会做什么?你可以这样访问它

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

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

ptr[i].aptr[i].b

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

【讨论】:

  • 哦,是的,我真的错过了这一点。真的很喜欢你一步一步的方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多