c - C中的内存溢出混淆

标签 c arrays string memory overflow

这部分代码只是我在学校解决的一个任务。我应该做的就是打开文件 oblici.txt 并猜测里面的图形(10x10 字段由 # 和 - 显示图形)。所以,我错误地计算了字符串 s 的大小,而不是 11 我只分配了 10 个空格。问题是,它不会超过 2。好吧,我找到了一个解决方案(s[11] 并且有效)但无法弄清楚为什么这是一个问题。不仅仅是为什么它是一个问题,我知道溢出不是一件好事,但是当我有 if(b>0) 时它怎么能写 0(而不是 9)这 cleary 消除了在数组 x 中写入 0 的可能性。我唯一的猜测是 '\0' 的值为 0,它被写在 b 中,但这没有意义......

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp=NULL;
    int x[10],i,j=0,b=0;
    char s[10];
    fp=fopen("c:\\temp\\oblici.txt","r");
    if (fp==NULL)
        exit(1);
    while(fscanf(fp,"%s",s)!=EOF){
        for(i=0;i<10;i++)
            if(s[i]=='-')
                b++;
        if(b>0)
            x[j++]=b;
        b=0;
    }
    for(i=0;i<j;i++)
        printf("%d ",x[i]);
    fclose(fp);
}

其中 oblici.txt 是:

enter image description here

最佳答案

因为每行末尾有一个换行符(\n),所以每行一共11个字符。使用 10 会使计算困惑。

作为提示,顺便说一句,避免不在 ifforwhile 语句周围使用 {} 作为这是引入错误的一种非常常见的方式!

关于c - C中的内存溢出混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41075794/

相关文章:

cppcheck : Buffer is accessed out of bounds

c++ - 固定大小数组的 vector

JavaScript - 检查字符串是否包含数组中彼此相邻的两个字符串并在其间插入字符串

string - 检测prolog中字符串的所有k个长度的单词

c - 如果有的话,隐式函数声明在 c/c++ 中的作用是什么?

c - 在 C 中运行时评估 switch 表达式

c - 冒泡排序在 printf (""时不起作用;从代码中删除

java - 更大元素的数组

java - 查找数组中出现的重复项的数量 - Java

c - 低级 IO read() 和 write()