繁体   English   中英

无论如何在三重指针上进行记忆设置?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM