我定义了结构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
    }

10-07 15:15