[英]Is there anyway to memset over a triple pointer?
由于各种原因,我有一个需要以三重指针形式传递的对象列表。 我这样宣布。
List=((Entity***) malloc(sizeof(Entity) * 32));
传递此列表的每个循环都需要擦除整个列表,而我尝试使用下面的代码行。
memset(&***List,0,sizeof(Entity) * 32);
该方法的最终结果是访问冲突错误。 我该怎么办才能解决这个问题?
假设您声明一个动态分配的三维数组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常量可以在编译时确定,并直接声明Entity List [M] [N] [K]。 因此,您可以将其初始化为:
memset(List, 0, sizeof(Entity) * M * N * K);
是的,您的代码中有错误。 我喜欢用简单的代码来解释
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;
}
在执行步骤1之后,您尝试执行步骤4。 但是您错过了step2&3。 这意味着您仅为3D指针分配了内存。 在不分配1D内存的情况下,将对1D指针进行memset。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.