【问题标题】:Segmantation Fault - C using malloc分段错误 - C 使用 malloc
【发布时间】:2011-08-23 15:03:29
【问题描述】:

我正在尝试为指向对象的指针数组分配内存。 ObjectP 是一个指向名为 Object 的结构的指针。 在该函数之前,我在数组上声明为:ObjectP* 数组。所以数组是指向对象指针数组的指针。 然后我发送 &array 所以我会有一个指向它的指针。 假设我的 table_size 为 2。当我尝试输入 *array[1]=NULL 时出现分段错误。 有什么问题?

这是我的代码:

    void allocateArrayMemory(ObjectP** array,size_t table_size)
    {
    *array=(ObjectP*)malloc(table_size*sizeof(ObjectP));
    int i=0;
    for (i = 0; i < (int)table_size; ++i)
    {
        *array[i]=NULL;
        printf("%d\n",i);
    }
    printf("finished allocating\n");
    if(*array==NULL)
    {
        printf("null\n");
    }

    }

【问题讨论】:

  • 请编辑您的问题并调整格式。
  • 试试(*array)[i]=NULL;

标签: malloc


【解决方案1】:

代码*array[i]=NULL; 的作用类似于*(array[i])=NULL;,而您想要的是(*array)[i]=NULL;

当 i=1 时,*(array[i]) 取消引用您传入 allocateArrayMemory 的 struct Object *** 之后的 struct Object ***,而 (*array)[i] 取消引用新分配的内存区域中的第二个 struct Object **

一些注意事项:

  1. 修复标题中“分段”的拼写。

  2. 使用前测试 malloc 的结果。在您的代码中,您在使用 *array; 后进行了测试。向上移动。

  3. 我建议使用memset(*array, 0, table_size*sizeof(ObjectP)); 而不是循环来初始化*array。

  4. 在 C 中强制转换 malloc 结果是一种不好的形式。而是直接说*array = malloc(table_size*sizeof(ObjectP));

  5. 从风格上讲,我将 allocateArrayMemory 设为一个函数,该函数返回分配的内存地址,而不是通过参数。例如:

    ObjectP* allocateArrayMemory(size_t table_size) {

    ObjectP *array = malloc(table_size*sizeof(ObjectP));

    ...

    if(array==NULL) { printf ...; return NULL; }

    ...

    for (i=0; i &lt; table_size; ++i)

    {
    

    array[i] = NULL;

    ...

    }
    

    ...

    return array;

在调用者中,ObjectP *a; ... a = allocateArrayMemory(6);

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多