【问题标题】:Memory overflow confusion in CC中的内存溢出混淆
【发布时间】:2016-12-10 12:58:12
【问题描述】:

这部分代码只是我在学校解决的一个小任务。我要做的就是打开文件 oblici.txt 并猜测里面的数字(10x10 字段,由 # 和 - 显示数字)。所以,我错误地计算了字符串 s 的大小,而不是 11,我只分配了 10 个空格。问题是,它不会超过 2。好吧,我找到了一个解决方案(s[11] 并且它有效)但无法弄清楚为什么这是一个问题。不仅仅是为什么这是一个问题,我知道溢出不是一件好事,但是当我有if(b>0) 时它怎么能写0(而不是9),这显然消除了在数组@987654324 内写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 在哪里:

【问题讨论】:

    标签: c arrays string memory overflow


    【解决方案1】:

    这是因为每行末尾有一个换行符(\n),因此每行总共有 11 个字符。使用 10 会搞乱计算。

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

    【讨论】:

      猜你喜欢
      • 2022-06-21
      • 2012-12-13
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2013-06-09
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多