C ptr***不工作

C ptr***不工作,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,当代码必须通过main中第二个for循环中的c.foos访问foo元素时,代码工作不正常(segfault) 它只正确显示第一个元素,然后在i=1时显示垃圾,在i=2时最终崩溃 所以我想这和指针数学有关 如何正确地做?数据结构不允许更改(不,这不是家庭作业,它是数据结构的一个过于简化的POC) #包括 #包括 typedef结构{ int i; }傅; typedef struct\u foo\u容器{ foo***foos; }容器; foo**init\u foos(无效){ foo**f;

当代码必须通过main中第二个for循环中的c.foos访问foo元素时,代码工作不正常(segfault)

它只正确显示第一个元素,然后在i=1时显示垃圾,在i=2时最终崩溃

所以我想这和指针数学有关

如何正确地做?数据结构不允许更改(不,这不是家庭作业,它是数据结构的一个过于简化的POC)

#包括
#包括
typedef结构{
int i;
}傅;
typedef struct\u foo\u容器{
foo***foos;
}容器;
foo**init\u foos(无效){
foo**f;
int i;
f=malloc(sizeof(foo*)*3);
对于(i=0;i<3;i++){
f[i]=malloc(sizeof(foo));
f[i]>i=i*11+1;
}
返回f;
}
内部主(空){
容器c;
foo**foos;
foos=init_foos();
c、 foos=&foos;
int i;
对于(i=0;i<3;i++){
printf(“%d%d\n”,i,foos[i]->i);
}
对于(i=0;i<3;i++){
printf(“%d%d\n”,i,(**c.foos[i]).i);
}
//内存泄漏,我知道
返回退出成功;
}
注意:此代码似乎有效。我猜自从上次gcc升级以来也发生了一些事情,尽管我可能仍然在做一些错误的事情

附录:很抱歉大家错过了
*3
,我很匆忙地写了这个POC。实际代码通过php的
safe\u emalloc()

Try:

printf("%d %d\n", i, (*(*c.foos)[i]).i);
我认为问题在于运营商。如果表达式未设置为父级,则“[]”在“*”之前求值。

请尝试:

printf("%d %d\n", i, (*(*c.foos)[i]).i);

我认为问题在于运营商。如果您不将表达式设置为父级,则“[]”在“*”之前求值。

我认为您的问题在于:

f = malloc(sizeof(foo*));
看起来您需要的是一个foo指针数组,但您只分配一个foo指针

尝试将其更改为:

f = malloc(sizeof(foo*) * 3);

我认为你的问题在于:

f = malloc(sizeof(foo*));
看起来您需要的是一个foo指针数组,但您只分配一个foo指针

尝试将其更改为:

f = malloc(sizeof(foo*) * 3);
您分配的内存块大小相当于指向
foo
的指针。但是紧接着,您将其索引为
f[i]
,其中
i
最多为2。因此,您正在访问尚未分配的内存


您分配的内存块大小相当于指向
foo
的指针。但是紧接着,您将其索引为
f[i]
,其中
i
最多为2。因此,您正在访问尚未分配的内存。

init\u foo
中,您必须分配
3*sizeof(foo*)
init\u foo
中,您必须分配
3*sizeof(foo*)

s/这段代码曾经工作过/这段代码似乎工作过一次/s/这段代码曾经工作过/这段代码似乎工作过一次/即使这修复了您看到的错误,看起来您仍然有另一个bug需要修复。是的,这个bug不在实际代码中,我刚刚匆忙编写了这个POC。我使用的是php的safe_emalloc(),它也将nmemb作为参数。即使这修复了您看到的错误,看起来您仍然有另一个应该修复的错误。是的,该错误不在实际代码中,我只是匆忙编写了这个POC。我使用的是php的safe_emalloc(),它也将nmemb作为参数。