由于各种原因,我有一个对象列表,我需要以三指针的形式传递。我声明就是这样。
List=((Entity***) malloc(sizeof(Entity) * 32));
传递此列表的每个循环都需要擦除整个列表,我尝试使用下面的行。
memset(&***List,0,sizeof(Entity) * 32);
该方法的最终结果是访问冲突错误。我该怎么做才能解决这个问题?
答案 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指针完成的。