无论如何,对三重指针进行memset?

时间:2014-10-24 02:31:32

标签: c

由于各种原因,我有一个对象列表,我需要以三指针的形式传递。我声明就是这样。

List=((Entity***) malloc(sizeof(Entity) * 32));

传递此列表的每个循环都需要擦除整个列表,我尝试使用下面的行。

memset(&***List,0,sizeof(Entity) * 32); 

该方法的最终结果是访问冲突错误。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:4)

假设您正在声明一个动态分配的三维数组List [M] [N] [K],初始化它的正确方法是:

List = (Entity***)malloc(sizeof(Entity**) * M);
for (int i = 0; i < M; ++i) {
    List[i] = (Entity**)malloc(sizeof(Entity*) * N);
    for (int j = 0; j < N; ++j) {
        List[i][j] = (Entity*)malloc(sizeof(Entity) * K);
        for (int k = 0; k < K; ++k) {
            memset(&List[i][j][k], 0, sizeof(Entity));
        }
    }
}

但是假设您要初始化一个静态分配的数组,如上所述,您应该生成可以在编译时确定的M,N,K常量,并直接声明实体列表[M] [N] [K]。因此,您可以将其初始化为:

memset(List, 0, sizeof(Entity) * M * N * K);

答案 1 :(得分:0)

是的,您的代码中存在错误。我想用简单的代码解释

 int main(void){

 char ***List = NULL;
 List=malloc(sizeof(char **) * 32); //step1
 List[0]= malloc(sizeof(char *) * 32);//step2
 List[0][0]=malloc(sizeof(char) * 32);//step3
 memset(&List[0][0][0],0,sizeof(char) * 32); //step4

  return 0; 
}

执行step1后,您正尝试执行step4。但是你错过了step2&amp; 3。这意味着您只为3D指针分配了内存。不分配1D内存memset是为1D指针完成的。