分段错误 - 使用malloc的C语言

时间:2011-08-23 15:03:29

标签: malloc

我正在尝试为指向对象的数组分配内存。 ObjectP是一个指向Object的指针。 在该函数之前,我在数组上声明:ObjectP * array。所以数组是指向对象指针数组的指针。 然后我发送&数组,所以我会指向那个。 假设我的table_size是2.当我尝试输入* array [1] = NULL时,我得到Segmentation故障。 有什么问题?

这是我的代码:

    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");
    }

    }

1 个答案:

答案 0 :(得分:1)

代码*array[i]=NULL;的行为与*(array[i])=NULL;类似,您想要的是(*array)[i]=NULL;

当i = 1时,*(array[i])取消引用您传入的struct Object ***之后的struct Object ***到allocateArrayMemory,而(*array)[i]取消引用第二个struct Object **新鲜的记忆区域。

一些注意事项:

  1. 修正标题中“细分”的拼写。

  2. 使用前测试malloc的结果。在您的代码中,您使用* array后进行测试;提升它。

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

  4. 在C中施加malloc结果是不好的形式。而只是说*array = malloc(table_size*sizeof(ObjectP));

  5. 作为一种风格问题,我将allocateArrayMemory作为一个函数,它返回已分配内存的地址,而不是via参数。例如:

    ObjectP* allocateArrayMemory(size_t table_size) {

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

    ...

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

    ...

    for (i=0; i < table_size; ++i)

    {
    

    array[i] = NULL;

    ...

    }
    

    ...

    return array;

  6. 并且在来电者中ObjectP *a; ... a = allocateArrayMemory(6);