c - 将结构变量传递给函数:segfault

时间:2014-07-28 09:36:39

标签: c pointers struct segmentation-fault

上下文

这是我的代码

typedef struct {
    int m;
    int (*v)(int *restrict a);
} polo;

int toto(int *restrict a){
    printf("hello %d\n",*a);
}
int main()
{

    polo *kilo;
    kilo->m = 84;
    kilo->v = toto;

    kilo->v(&kilo->m);

    return 0;

}

问题

段错误。 我不明白为什么。如果kilo不再是指针,则相同的代码可以工作。 (polo kilo; kilo.m = ...)。

你能解释一下吗?

由于

5 个答案:

答案 0 :(得分:4)

您需要为kilo预留空间:

polo *kilo = malloc(sizeof(*kilo));

polo *kilo = malloc(sizeof(polo));

不要忘记最后致电free(kilo);

答案 1 :(得分:1)

在使用指针之前应该分配内存。

你可以这样做:

polo *kilo = malloc(sizeof(polo));

polo temp;
polo *kilo = &temp;

然后其余的代码将正常工作。

答案 2 :(得分:1)

您需要为指针kilo分配内存。

int main()
{

polo *kilo;
kilo = malloc(sizfof(polo)); 
kilo->m = 84;
kilo->v = toto;

kilo->v(&kilo->m);
free(kilo);
return 0;

}

如果没有为结构指针分配内存,则无法将值存储在结构成员中。

但是当你声明polo kilo;时,它不需要内存分配。因为您被声明为结构变量。当你声明结构变量时,内存os是静态分配给它的。所以它会工作!

答案 3 :(得分:0)

未初始化的本地(非静态)变量的值是 indeterminate ,使用这样的变量(初始化除外)导致undefined behavior,这可能导致崩溃。

这里的问题是你声明kilo是一个指针,但是你没有把它指向任何地方。实际上,在第一种情况下将它作为指针实际上是没有用的,只需将它声明为普通的非指针变量:

polo kilo;
kilo.m = 84;
kilo.v = &toto;

kilo.v(&kilo.m);

当天的提示:避免尽可能多地使用指针,除非小心,否则它们是问题的重要来源。

答案 4 :(得分:0)

polo *kilo; - 定义了指向polo的千位指针,但指向任何位置。

kilo->m = 84 - 您要将84写入随机地址。段错误。