使用结构时出现 C 分段错误

C segmentation fault while using structures

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

#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;
}

您已经声明了一个指向 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;
}

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

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

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

输出整个字符串

以下建议代码:

  1. 消除了对 malloc()free()
  2. 的任何需求
  3. 执行所需的功能
  4. 将结构的定义与结构的任何实例分开。
  5. 在蛇名的第一个字母和蛇的 'size' 之间插入一些间距,以提高可读性
  6. 为了 'human' 可读性
  7. 对代码应用某些其他更改

现在建议的代码:

#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 运行 提议的代码输出:

A  3.700000
P  2.400000