对遇到的段错误的反思

源代码如下:

1 #include <stdio.h>

2
3 struct CoinPurse{
4 | unsigned gold;
5 | unsigned silver;
6 | unsigned cooper;
7 };
8
9 struct CoinPurse countCoins(char *coins){
10 | static struct CoinPurse cp;// = {0, 0, 0};
11 | char c;
12
13 | if(coins == NULL)
14 | | exit(1);
15 | while( (c=*coins) != '\0'){
16 | | switch(c){
17 | | | case 'g': cp.gold++;
18 | | | | break;
19 | | | case 's': cp.silver++;
20 | | | | break;
21 | | | case 'c': cp.cooper++;
22 | | | | break;
23 | | }
24 | | coins++;
25 | }
26
27 | return cp;
28 }
29
30 int main(){
31 | char *coins;
32 | struct CoinPurse cp;
33
34 | printf("please input a string made purely of 's', 'g' or 'c'\n");
35 | gets(coins);
36 | cp = countCoins(coins);
37 | printf("gold: %d\tsilver: %d\tcooper: %d\n", cp.gold, cp.silver, cp.cooper);
38
39 | return 0;

40 }

这段程序执行起来没有问题,但退出时报了"segmentation fault"

问题出在main函数的coins指针上。coins指针负责存储从终端传过来的一个字符串,但没有给其分配空间,因此读入的字符串被存储到一个未知的位置。程序退出时,出现了问题。


这段代码还有很多问题,比如使用了gets()而不是fgets()。但最大的问题在于我在写程序时脑子里没有内存的概念,最近在读《C专家编程》,里面对于程序的组成结构和运行时结构有很好的讲解,带着那些知识去看我的程序,很容易就发现那个错误。

在C语言中,使用指针是件恐怖的事情,因为很容易将指针自身与指针所指向的地址弄混。我认为在使用指针时,一定要确定这个指针所指向内存的位置及生命周期,如果这个问题想不清楚,就容易出现运行时错误。

你可能感兴趣的:(错误)