2014-03-05 20 views
0

我试图一次添加一个字符到char数组,称为缓冲区。当我尝试添加一个字符到缓冲区[count]时,出现了分段错误。但是,如果我尝试添加一个字符缓冲区[0],缓冲区[1],或任何其他整数偏移它运行良好。这里是我的代码:当使用变量来抵消数组时,Seg错误

#include <stdio.h> 


int main(int argc, char *argv[]){ 
    FILE * fp; 
    char buffer[100]; 

    fp = fopen(*(argv+1), "r"); 

    if(fp == NULL){ 
     printf("File \"%s\" not found!\n", *(argv+1)); 
     return 0; 
    } 

    int curr_char; 
    unsigned int count = 0; 
    unsigned int min_len; 

    while(!feof(fp)){ 

     curr_char = fgetc(fp); 

     if((curr_char >= 32) && (curr_char <= 126)){ 
      buffer[count] = curr_char; 
      printf("%c", curr_char); 
      count++; 

      if(!((curr_char >= 32) && (curr_char <= 126))){ 
       break; 
      } 

     } 
    } 
} 

为什么不允许使用buffer [count]?

回答

0

当您说char buffer[100]它为RAM分配100个字节时,您可以访问只分配给您的内存。说从地址1001到1100的时候,你试着说buffer[453]它在内部转换为如下语句*(buffer + 453)

其中缓冲区基址为1001和453被添加到它,然后第1454次字节试图访问这是不因为它可能会导致严重的问题,例如(从其他进程访问数据等)。所以内核通过发送一个信号来停止用户执行SIGSEGV

编辑:因为它计数文件您的阅读可能有超过100个字节。这再次不在你的过程中。尽量增加你的缓冲区的大小说char buffer[1024]

+0

好的,有道理。谢谢。 – user2121620

3

当缓冲区大小仅为100时,如何访问位置453,如buffer[453]?这是UB。

+0

啊,对不起,我用它来调试。它应该是'数'而不是。 – user2121620

+0

如果超过100,你是否正在输出'count'的值,你会得到奇怪的结果,从奇怪的输出到seg错误。 – Sadique

1
char buffer[100]; 

你只可以访问buffer[0]buffer[99]。 在您的代码count可能超过99,所以可能有段故障。

1

如果您的输入文件超过100个字符,您的count将会大于100,并且您将有一个缓冲区溢出,这是未定义的行为,分段错误是一种常见的可能性。

您代码中的另一个常见问题是您错误地使用feof(),请参阅“while(!feof(file))” is always wrong

+0

谢谢你指出。 – user2121620