2014-11-01 63 views
0

我只是想运行一个简单的程序来计算空格,数字和其他字符数使用数组的数量。下面是我的程序:分段错误&打印一个没有循环的数组

void main(){ 


    int digit_holders[10]={0}; 
    int ch; 
    int i, white_space=0,other=0; 

    while((ch=getchar())!=EOF){ 

      if(isspace(ch)) 
        white_space++; 
      else if(isdigit(ch)) 
        digit_holders[ch-'0']++; 
      else 
        other++; 
    } 
    digit_holders[12]=20; 
    printf("\n White spaces=%d\n Other=%d\n",white_space,other); 
    for(i=0;i<=9;i++) 
      printf("\ndigit_holders[%d]=%d\n",i,digit_holders[i]); 
    printf("\n digit_holder[12]=%d\n",digit_holders[12]); 
} 

2个问题:

  1. 为什么digit_holders [12]仍设法打印尽管它是范围之外的分配淡水河谷?为什么它不显示分段错误?当我将for循环检查更改为= 11它管理打印digit_holders [11] = 0(它不应该)时,会发生同样的情况。但是,当我将11/10与1100即数字持有人[1100]在任何情况下,程序崩溃(分段故障)。为什么这样 ?
  2. 有没有更简单的方法来打印这个数组的元素而不使用for循环?

- 谢谢!

+0

轻松地在Python中打印出一串字符串,不需要,您需要一个循环来打印C中的数组内容。您正在分配的数组的第12个元素仅声明了10个元素,它有风险做和不稳定,但不一定会导致seg故障,因为如果操作系统在写入和读取之间的时间内没有修改它你的指针将毫无错误地解析这个值。但是,风险很大。 – 2014-11-01 11:08:01

回答

1

在C中没有范围检查,所以它是最好的拍摄(即足够的绳索挂上自己和家人的其他人)。

操作系统发生分割错误。即尝试访问未分配给进程的内存。

1

正如我在评论中写道:

您将需要某种形式的循环打印您阵列的内容C.

你只有10个元素分配一个数组的第13个元素声明,它有风险做和不稳定,但不一定会导致seg错误,因为如果OS在写入和读取之间没有修改它,你的指针将毫无错误地解析值。但是,风险很大。

如果您已经声明了一个包含13个元素的数组,所有13个元素将被保留在内存中,并且不会出现seg错误。如果您询问超出其声明范围的数组,您可能会遇到seg故障,而且越远离您定义的范围。

0

可以在C中打印“超出范围”的数组索引,因为digit_holders[12]的处理方式与digit_holders是一个指针,其偏移量为12 * sizeof(int)添加到它上面。

这不一定会导致分段错误,因为正在读取的内存地址仍可能被指定为“可用”程序。这方面的一个很好的例子是包含数组的struct

typedef struct { 
    int some_array[12]; 
    int another_int; 
} my_struct; 

如果你读的some_array[12]的价值,你会得到的another_int内容,而不是,因为它是最后一个“有效”索引之后直接存储some_array

至于数组的打印:我不知道有什么方法可以在不使用C语言中的循环的情况下打印出数组,尽管它在其他一些语言中是可行的。例如,您可以使用print(", ".join(["This", "That", "The other"]))