从C中的函数中的结构调用结构

时间:2014-11-30 12:46:57

标签: c struct segmentation-fault

在我的程序中,我有两个结构:

#include <stdio.h>

struct human {
  struct human_header *human_header;
  char *name;
};

struct human_header {
  unsigned short number;
};

void f2(struct human_header *human_header) {
  human_header->number = 1;
}

void f1(struct human *human) {
  f2(human->human_header);
}

int main (int argc, char *argv) {
  struct human *human;
  f1(human);
  printf("END\n");
  return 0;
}

我不明白为什么我有分段错误......有人可以解释一下吗?

3 个答案:

答案 0 :(得分:1)

您会收到细分错误,因为人类和人类&gt;标头未初始化。 你应该做到以下几点:

human = malloc(sizeof(struct human));
human->header = malloc(sizeof(struct human_header));
f1(human);
free(human->header);
free(human);

答案 1 :(得分:0)

代码行

 stuct human* human;

创建一个自动变量human,它将包含人体结构的地址。你的代码中没有实际创建该结构的地方。

所以你需要做的就是这个;

int main (int argc, char *argv) {
    struct human *human = malloc(sizeof(struct human));

    if(NULL != human) {
        human->human_header = malloc(sizeof(struct human_header));

        if(NULL != human->human_header)
        {
            f1(human);

            free(human->human_header);
        }
        free(human);
    }
    printf("END\n");
    return 0;
}

另外,因为struct human包含指向其他对象的指针,所以在尝试使用它们之前也必须创建这些对象(就像我创建的man_header一样)。您还必须处理name

假设struct human_header不会变得更复杂,那么将struct human定义为:

可能更好
struct human
{
    int    number;
    char*  name;
}

其他一些警告:

  1. 如果您要分配动态内存,请始终确保该分配正常工作,如上所述。
  2. 如果您要分配动态内存,请始终确保您记得释放内存,如上所示。正如您所注意到的,代码已经开始变得更加复杂,所以我建议创建一个函数来正确创建一个新的人体结构(可能是initHuman)和一个正确清理人体结构的函数(mabey delHuman)。
  3. 最后警告,在mallocs中你要使用结构的大小而不是指向结构的指针的大小;即malloc(sizeof(struct human))而不是malloc(sizeof(struct human*)) - 这是我们在开始时至少做一次的另一个常见错误。

答案 2 :(得分:0)

你将一个未初始化的指针传递给f(1),这是好的(但可能不是你想要的)。 然后当你的指针只是结构的TYPE时,你尝试访问一个struc字段,但结构本身不存在......

您可以关注此代码所发生的事情(它实际上是您的代码与printf ..):

#include <stdio.h>

struct human {
  struct human_header *human_header;
  char *name;
};

struct human_header {
  unsigned short number;
};

void f2(struct human_header *human_header) {

  human_header->number = 1;
}

void f1(struct human *human) {
    printf("%p \n", human);
  f2(human->human_header);
}

int main (int argc, char *argv) {
  struct human *human;
  printf("%p\n", human);
  f1(human);
  printf("END\n");
  return 0;
}