C 使用变量偏移阵列时出现Seg故障

C 使用变量偏移阵列时出现Seg故障,c,arrays,char,C,Arrays,Char,我试图一次添加一个字符到一个名为buffer的字符数组中。当我试图将一个字符添加到缓冲区[count]时,我得到了一个分段错误。但是,如果我尝试向缓冲区[0]、缓冲区[1]或任何其他整数偏移量添加一个字符,它将正常运行。这是我的密码: #include <stdio.h> int main(int argc, char *argv[]){ FILE * fp; char buffer[100]; fp = fopen(*(argv+1), "r");

我试图一次添加一个字符到一个名为buffer的字符数组中。当我试图将一个字符添加到缓冲区[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;
            }

        }
    }
}
#包括
int main(int argc,char*argv[]){
文件*fp;
字符缓冲区[100];
fp=fopen(*(argv+1),“r”);
如果(fp==NULL){
printf(“未找到文件\%s\”!\n“,*(argv+1));
返回0;
}
int curr_char;
无符号整数计数=0;
无符号整数最小值;
而(!feof(fp)){
curr_char=fgetc(fp);

如果((curr\u char>=32)和(&&(curr\u char=32)和(&)(curr\u char当您的缓冲区大小只有100时,您如何访问这样的位置453
缓冲区[453]
?这是UB。

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

当您说
字符缓冲区[100]
时,您只能访问分配给您的内存。它在ram中为您分配100字节。比如从地址1001到1100。当您尝试说
缓冲区[453]
时,它会在内部转换为类似
*(buffer+453)的语句

如果缓冲区基址是1001,加上453,则尝试访问1454字节,这是不允许的,因为这可能会导致严重问题,如(从其他进程访问数据等)。因此内核通过发送信号
SIGSEGV


编辑:从中读取的文件数可能超过100字节。这也不在您的处理范围内。请尝试增加缓冲区大小,例如
char buffer[1024]

当您说
char buffer[100]时,您只能访问分配给您的内存
它在ram中为您分配100个字节。比如从地址1001到1100。当您尝试说
缓冲区[453]
时,它会在内部转换为类似
*(缓冲区+453)

char buffer[100]; 
如果缓冲区基址是1001,加上453,则尝试访问1454字节,这是不允许的,因为这可能会导致严重问题,如(从其他进程访问数据等)。因此内核通过发送信号
SIGSEGV

编辑:从中读取的文件数可能超过100字节。这同样不在进程的范围内。请尝试增加缓冲区大小,例如
char buffer[1024]

char buffer[100]; 
您只能从
缓冲区[0]
访问
缓冲区[99]
。 在代码中,
计数
可能超过
99
,因此可能存在段错误

您只能从
缓冲区[0]
访问
缓冲区[99]

代码中的
计数可能超过
99,因此可能存在段错误。

如果输入文件超过100个字符,则
计数将大于100,并且将出现缓冲区溢出,这是未定义的行为,段错误是常见的可能性之一


代码中的另一个常见问题是错误地使用了
feof()
,请参阅。

如果输入文件的字符数超过100个,则
计数将超过100个,并且会出现缓冲区溢出,这是一种未定义的行为,分段错误是常见的可能性之一


代码中的另一个常见问题是使用
feof()
错误,请参见。

啊,对不起,我用它来调试。它应该是“count”。如果它超过100,你是否打印
count
的值,你会得到奇怪的结果,从奇怪的输出到seg故障。啊,对不起,我用它来调试。它应该是“count”。如果它是100,你是否打印
count
的值你会得到奇怪的结果,从奇怪的输出到seg故障。好的,有道理。谢谢。好的,有道理。谢谢。