【问题标题】:c - Passing a structure variable to a function : segfaultc - 将结构变量传递给函数:segfault
【发布时间】:2014-07-28 09:36:38
【问题描述】:
上下文
这是我的代码
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.m=...)。
你能解释一下吗?
谢谢
【问题讨论】:
标签:
c
pointers
struct
segmentation-fault
【解决方案1】:
您需要为kilo预留空间:
polo *kilo = malloc(sizeof(*kilo));
或
polo *kilo = malloc(sizeof(polo));
最后别忘了给free(kilo);打电话。
【解决方案2】:
你应该在使用指针之前分配内存。
你可以这样做:
polo *kilo = malloc(sizeof(polo));
或
polo temp;
polo *kilo = &temp;
然后剩下的代码就可以正常工作了。
【解决方案3】:
你需要为指针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; 时,它不需要内存分配。因为您被声明为结构变量。当您声明结构变量时,为其分配的内存是静态的。所以它会工作!
【解决方案4】:
未初始化的本地(非静态)变量的值是不确定的,使用这样的变量(初始化除外)会导致undefined behavior 导致崩溃。
这里的问题是你声明kilo 是一个指针,但你没有让它指向任何地方。其实第一种情况下,把它变成指针真的没什么用,直接声明为普通的非指针变量就好了:
polo kilo;
kilo.m = 84;
kilo.v = &toto;
kilo.v(&kilo.m);
每日小贴士:尽可能避免使用指针,除非小心,否则它们会引起很大的问题。
【解决方案5】:
polo *kilo; - 定义了指向 polo 的公斤指针,但指向任何地方。
kilo->m = 84 - 您尝试将 84 写入随机地址。错误。