我正在尝试为指向对象的数组分配内存。 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");
}
}
答案 0 :(得分:1)
代码*array[i]=NULL;
的行为与*(array[i])=NULL;
类似,您想要的是(*array)[i]=NULL;
。
当i = 1时,*(array[i])
取消引用您传入的struct Object ***
之后的struct Object ***
到allocateArrayMemory,而(*array)[i]
取消引用第二个struct Object **
新鲜的记忆区域。
一些注意事项:
修正标题中“细分”的拼写。
使用前测试malloc的结果。在您的代码中,您使用* array后进行测试;提升它。
我建议使用memset(*array, 0, table_size*sizeof(ObjectP));
而不是循环来初始化*数组。
在C中施加malloc结果是不好的形式。而只是说*array = malloc(table_size*sizeof(ObjectP));
。
作为一种风格问题,我将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;
并且在来电者中ObjectP *a;
... a = allocateArrayMemory(6);
。