使用变量偏移数组时出现Seg错误

时间:2014-03-05 07:00:29

标签: c arrays char

我试图一次将一个字符添加到一个名为buffer的char数组中。当我尝试添加一个字符缓冲[count]时,我得到一个分段错误。但是,如果我尝试将字符添加到缓冲区[0],缓冲区[1]或任何其他整数偏移量,它运行正常。这是我的代码:

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

        }
    }
}

为什么不允许缓冲区[count]?

4 个答案:

答案 0 :(得分:3)

当缓冲区的大小只有100时,如何像buffer[453]这样访问位置453?这是UB。

答案 1 :(得分:1)

char buffer[100]; 

您只能从buffer[0]访问buffer[99]。 在您的代码中count可能超过99,因此可能存在段错误。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

当你说char buffer[100]它为ram分配100个字节时,你可以访问仅分配给你的内存。从地址1001到1100说。当你试图说buffer[453]时,它会在内部转换成*(buffer + 453)

之类的语句

其中缓冲区基址为1001.并且向其添加453然后尝试访问第1454个字节,这是不允许的,因为它可能导致严重的问题,例如(从其他进程访问数据等)。所以内核通过发送信号SIGSEGV

来暂停用户执行

编辑:因为它计算您的读取文件可能有超过100个字节。这也不在你的过程范围内。尝试增加缓冲区大小说char buffer[1024]