我定义了结构StructA
和函数StructA createStructA(...)
,它们创建并返回一个新的StructA
。我想要一个函数foo()
,它将显式返回int
错误代码以及我想在StructA
之外使用的新foo()
。所以看来我需要指向的指针:
int foo(StructA **pA) {
// Allocate some memory:
*pA = malloc(sizeof(StructA)); // (Editor's note: don't cast the return of malloc.)
// check that malloc() didn't error.
assert(*pA);
// Fill out a new StructA with createStructA():
StructA a = createStructA(...);
// return
*pA = &a;
return 0;
}
为什么此代码会因分段错误而退出?看来这是由于malloc造成的,就像我注释掉所有其他行(除了malloc之外)一样,它仍然会因segfault而中断
由于上面的代码似乎不清楚,这是我的问题的MCVE:
#include <stdio.h>
#include <malloc.h>
typedef struct {
int x;
int y;
} A;
typedef struct {
A a;
int z;
} B;
A makeA() {
return (A) {.x = 1, .y = 2};
}
B makeB(A a1) {
return (B) {.a = a1, .z = 3};
}
void parseA(A **ppa) {
*ppa = malloc(sizeof(A)); // crashes with segfault here
**ppa = makeA();
}
void parseB(B **ppb) {
A **ppa;
parseA(ppa);
// todo make B .. but it's already crashing
}
int main() {
B **ppb;
parseB(ppb);
return 0;
}
最佳答案
*pA = &a
设置* pA指向函数foo中的局部变量。函数返回时,局部变量超出范围,因此* pA无效。
编辑:
只需阅读您的新代码即可。在*ppa = malloc(sizeof(A)); // crashes with segfault here
这行中,ppa尚不是有效的指针,您不能通过* ppa对其取消引用。首先需要做。
实际上,我在这里猜测,这是您想要的:
void parseA(A **ppa) {
*ppa = (A*)malloc(sizeof(A));
// todo make A, e.g. ppa->x = 1;
}
void parseB(B **ppb) {
A *ppa = NULL;
parseA(&ppa);
// ppa is a valid point now, you can do, e.g. ppa->y=1;
// todo make B
}