标题:栈溢出问题
只看楼主
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
结帖率:100%
已结贴  问题点数:20 回复次数:5 
栈溢出问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void)
{
    FILE  *fp;
    char a[2][80]={0},i=0;
    if((fp = fopen("a.txt", "w")) == NULL){
        printf("Can't Open File!");
        exit(0);
    }
    a[0][0]='c';
    a[1][0]='b';
     if(!feof(fp))
     {
           for(i=0;i<2;i++)
           {
             fprintf(fp,"%s ",a[i][0]);//我知道表示字符串要用数组名即a[i],问题是为什么用
                           // a[i][0]编译器不报错,运行时怎么溢出的啊?怎么把这过程搞清楚啊?
           }
     }
    fclose(fp);   
}

调试到 fprintf(fp,"%s ",a[i][0]);这一步就如图所示,百度了一下是栈溢出
  unhandled exception in 新建文本文档.exe:0xc00000005:Access Violation.
搜索更多相关主题的帖子:  溢出 include FILE void 
2020-04-09 10:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
我知道表示字符串要用数组名即a[i], a[i][0]编译器不报错
因为 fprintf 的原型是 int fprintf( FILE *stream, const char *format, ... );
所以你传什么类型的变量都是合乎语法的,你得自己去保证正确。
当然,现在的编译器能在编译时发现这个错误。

运行时怎么溢出的啊?
fprintf(fp,"%s ",a[i][0]); 就等同于 fprintf(fp,"%s ", 'c' );
不出错才奇怪呐
2020-04-09 11:08
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:5 
fprintf 是变参函数
他只知道第一个参数的类型
一共有多少个参数 其他参数是什么类型都是不清楚的
所以编译器没报错
现代编译器可以检查出类型不匹配 可能会有警告

运行时错误的因为 %s 执行方式是
从指定的地址开始读取数据 遇到0停止
你给出一个char
%s就把这个char当成地址
a[0][0]的值是 'c'也就是 0x00000063
%s 会从0x00000063这个地址开始读取数据直到遇到0字节
这个地址不允许读就出错了

https://zh.
2020-04-09 11:11
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
得分:5 
fprintf(fp, "%s ", &a[i][0]);
2020-04-09 11:12
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:5 
这些问题的理论解释都可以存在,但习惯上我一般都表示你完整地学完C语言以后就明白了,因为解释它需要引用相对后面的知识。

事实上很多问题不建议初学者深挖,凡事须知适可而止,从应用上看,更重要的是知道怎样写是正确的,而你已经知道了。
知道毒品有害不要去碰就好了,难道还要深入学习毒品的分子生物学作用机理?
吾生也有涯,而知也无涯。以有涯随无涯,殆已!

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-04-09 11:20
飞天大烧卖
Rank: 2
等 级:论坛游民
帖 子:45
专家分:27
注 册:2020-3-26
得分:0 
谢谢
2020-04-09 12:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500954-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034838 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved