【问题标题】:C segmentation fault while using structures使用结构时出现 C 分段错误
【发布时间】:2020-08-02 01:33:45
【问题描述】:

我正在尝试编写一个包含两个元素的数据结构,然后定义该结构类型的变量。但是,在主函数中初始化变量后,我遇到了分段错误,我不知道为什么。

#include <stdio.h>
#include <string.h> 

struct AnimalSizes {
    char stringName[50]; 
    double sizeLength; 
    } animalSizes[2]; 

int main()
{

    struct AnimalSizes *snakes; 
    strcpy(snakes[0].stringName,"Anaconda"); 
    snakes[0].sizeLength=3.7; 
    strcpy(snakes[1].stringName,"Python"); 
    snakes[1].sizeLength= 2.4; 
    printf("%c", *snakes[0].stringName); 
    printf("%lf", snakes[0].sizeLength); 
    printf("%c", *snakes[1].stringName); 
    printf("%lf", snakes[1].sizeLength);
    return 0;
}

【问题讨论】:

    标签: c data-structures segmentation-fault


    【解决方案1】:

    你已经声明了一个指向struct AnimalSizes的指针,并且你已经声明了一个数组struct AnimalSizes[2],但是你还没有使指针指向这个数组:

    int main()
    {
    
        struct AnimalSizes *snakes = &animalSizes[0]; 
    ...
    }
    

    或者,您可以选择不声明全局变量,而是选择在main 中分配内存:

    #include <stdlib.c>
    #include <stdio.h>
    #include <string.h> 
    
    struct AnimalSizes {
        char stringName[50]; 
        double sizeLength; 
        }; 
    
    int main()
    {
    
        struct AnimalSizes *snakes = (struct AnimalSizes*) malloc(2*sizeof(struct AnimalSizes)); 
        strcpy(snakes[0].stringName,"Anaconda"); 
        snakes[0].sizeLength=3.7; 
        strcpy(snakes[1].stringName,"Python"); 
        snakes[1].sizeLength= 2.4; 
        printf("%c", *snakes[0].stringName); 
        printf("%lf", snakes[0].sizeLength); 
        printf("%c", *snakes[1].stringName); 
        printf("%lf", snakes[1].sizeLength);
        free(snakes);
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      您尝试strcpy 到没有分配内存的目的地。那是未定义的行为。 您应该首先分配足够的内存来容纳两个 AnimalSizes 实例:

      struct AnimalSizes *snakes;
      snakes = malloc(2 * sizeof(struct AnimalSizes));
      

      另外,这里 printf("%c", snakes[0].stringName); 您正在尝试输出stringName 的第一个字符。我假设,你宁愿做的是用%s 输出整个字符串。

      【讨论】:

      • 您好,感谢您的回答!我想知道为什么我们必须使用动态内存分配。我有点迷失在那个话题上,任何帮助都将不胜感激!
      【解决方案3】:

      以下建议的代码:

      1. 无需malloc()free()
      2. 执行所需的功能
      3. 将结构的定义与结构的任何实例分开。
      4. 为了便于阅读,在蛇名的第一个字母和蛇的“大小”之间插入一些空格
      5. 对代码应用某些其他更改以实现“人类”可读性

      现在建议的代码:

      #include <stdio.h>
      #include <string.h> 
      
      struct AnimalSizes 
      {
          char stringName[50]; 
          double sizeLength; 
      };
      
      
      int main( void )
      {
          struct AnimalSizes snakes[2]; 
      
          strcpy(snakes[0].stringName,"Anaconda"); 
          snakes[0].sizeLength=3.7; 
      
          strcpy(snakes[1].stringName,"Python"); 
          snakes[1].sizeLength= 2.4; 
      
          printf("%c  ",  snakes[0].stringName[0]); 
          printf("%lf\n", snakes[0].sizeLength); 
      
          printf("%c  ",  snakes[1].stringName[0]); 
          printf("%lf\n", snakes[1].sizeLength);
          return 0;
      }
      

      建议的代码输出的运行:

      A  3.700000
      P  2.400000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 2020-08-04
        • 2014-05-31
        • 2011-03-23
        相关资源
        最近更新 更多