使用结构时出现 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
.
输出整个字符串
以下建议代码:
- 消除了对
malloc()
和 free()
的任何需求
- 执行所需的功能
- 将结构的定义与结构的任何实例分开。
- 在蛇名的第一个字母和蛇的 'size' 之间插入一些间距,以提高可读性
- 为了 'human' 可读性
对代码应用某些其他更改
现在建议的代码:
#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
我正在尝试编写一个包含两个元素的数据结构,然后定义该类型结构的变量。但是,在主函数中初始化变量后,出现分段错误,我不知道为什么。
#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
.
以下建议代码:
- 消除了对
malloc()
和free()
的任何需求
- 执行所需的功能
- 将结构的定义与结构的任何实例分开。
- 在蛇名的第一个字母和蛇的 'size' 之间插入一些间距,以提高可读性
- 为了 'human' 可读性 对代码应用某些其他更改
现在建议的代码:
#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