【问题标题】: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 写入随机地址。错误。

          【讨论】:

            猜你喜欢
            • 2015-02-12
            • 2012-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-15
            • 1970-01-01
            • 2021-08-28
            相关资源
            最近更新 更多