这是我的代码
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 = ...)。
你能解释一下吗?由于
答案 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写入随机地址。段错误。