为毛这个代码直接段错误了

飛雪一刀 2013-06-21 06:20:00
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXBUF 838000000

int main()
{
printf("-----------------------handle_message----------------------- \n");
getchar();
char buf[MAXBUF + 1];
return 0;
}


没有打印出------这句话,栈分配不是按照程序运行的先后顺序么?
...全文
670 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayer 2013-06-25
  • 打赏
  • 举报
回复
引用 24 楼 WizardOz 的回复:
你要搞清楚,C语言的栈内存分配是在程序开始之前进行的,跟你写的顺序没有关系。
+1
飛雪一刀 2013-06-25
  • 打赏
  • 举报
回复
感谢各位大牛
momo-lan 2013-06-24
  • 打赏
  • 举报
回复
引用 12 楼 fdyip86 的回复:
应该由于当进入main函数时,会事先分配好函数所有的临时变量的栈内存,赋值动作是执行到语句时候才赋值.. 楼主可以试一下把程序改成这样:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#define MAXBUF 838000000
 
int main()
{
    printf("-----------------------handle_message----------------------- \n");
    getchar();
    //char buf[MAXBUF + 1];
    char but[20] = {0};
    return 0;
}
然后在printf那行中打上断点,看看vs调试的自动窗口里面,已经有一个but的变量,但是值是乱的.执行到char but[20] = {0};这一行的时候.就对but赋值了.
guan_tu 2013-06-24
  • 打赏
  • 举报
回复
Allen_Zhong 2013-06-24
  • 打赏
  • 举报
回复
一般来讲在 32 位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:打开工程,依次操作菜单如下:Project->Setting->Link,在 Category 中选中 Output,然后在 Reserve 中设定堆栈的最大值和 commit。注意:reserve 最小值为 4Byte;commit 是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。 这里char buf[MAXBUF + 1];明显是一个在栈中开辟的内存空间, 太大了,所以爆栈了!
如此美丽的你 2013-06-24
  • 打赏
  • 举报
回复
引用 25 楼 zhao4zhong1 的回复:
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
学习了
lm_whales 2013-06-24
  • 打赏
  • 举报
回复
引用 33 楼 neolyao 的回复:
以前的我也经常问这种无聊的问题,也经常去看c/c++的反汇编觉得很牛B,现在看来自己都觉得非常好笑。 首先对于一个初学者来说研究这种牛角尖的问题毫无意义,要学会"不求甚解",这样会大大提高学习效率,语言只是工具会用就行,应该把时间放在你感兴趣的领域比如数据库或网络... 看到很多人用汇编来研究c/++语言明显是误入歧途,虽然通过汇编看到大多数语句的底层实现,但c/c++毕竟是高级语言,是抽象性的语言,有些抽象概念与汇编是有差异的,比如c函数的反汇编参数的pascal式入栈方式即从右往左依次入栈。但c语言函数的入栈方式真的是从右往左吗?? 看看下面代码:


void add(int a,int b)
{
   int m=a,n=b;
}
...
int main(...)
{
    int i=10;
    add(i,i++);
....
}
//猜猜 m、n的值??
//这段代码有问题吗??undefined behavior???
通过反汇编来研究c/c++这相当于通过玉米粉来研究玉米的品种,这加工方式就不知道有多少种,这不是坑爹吗???
C 是一种中级语言,是一种高级汇编语言。 入栈方式,不是独立的存在,而是存在于一种称为调用约定的函数调用里面的。 调用约定包括 1)入栈顺序, 2)函数编译后的名字, 3)函数使用几个寄存器,在某种CPU上使用那些寄存器那些。 4) 调用者还是被调用者清栈。 5)函数返回值,存放在那里 6) 入栈数据尺寸 1) cdcel C调用约定,C 缺省的调用约定。 C调用约定 1)参数全部入栈,顺序自右向左 2)函数名前加下划线 , fun -->_fun 区分大小写字母 3)不使用寄存器传递调用参数 4)调用者清栈 5)x86 32 bits: eax 或者 edx:eax 或者 浮点堆栈 存放返回值 6)其他 char ,short 等短整型数据会按照整型数据入栈(按照CPU字长入栈) 2)pacal pascal 语言刚发明时候,采用的调用约定。 pascal调用约定 1)参数全部入栈,顺序自左向右 2)函数名前加不加下划线 , fun -->fun, 不区分大小写字母 3)不使用寄存器传递调用参数 4)被调用者清栈 5)x86 32 bits: eax 或者 edx:eax 或者 浮点堆栈 存放返回值 6)其他 char ,short 等短整型数据会按照整型数据入栈(按照CPU字长入栈) 3) stdcall 标准调用约定, C++缺省使用的调用约定。 pascal调用约定 1)参数全部入栈,顺序自左向右 2)函数名前加不加下划线 , fun -->fun, 不区分大小写字母,函数名后会加一些用以识别参数个数和类型的字符 3)不使用寄存器传递调用参数 4)被调用者清栈 5)x86 32 bits: eax 或者 edx:eax 或者 浮点堆栈 存放返回值 6)其他 char ,short 等短整型数据会按照整型数据入栈(按照CPU字长入栈) 4)其它调用约定 ... 函数调用约定,是为了不同编程语言编写的程序,协同工作的; 以及同一语言,保持语义一致,而采取的类似标准的一种约定。 首先任何编程语言,只要不是纯解释型的语言,一定要能和汇编语言一起工作,以便拓展,扩充修改。 其次每种编程语言,都在不同领域积累了许多程序。 这些程序,非要修改成别的语言,是别扭的,而且工作量是巨大的,和不必要的。 这要求这些语言编写的程序能够协同工作。 这样调用约定统一,就变得非常必要了; 只需要调用者和被调用者的调用约定相同, 这些不同语言编写的程序,就可以在一起工作。 这样就需要定义,各种调用约定,以便能够让包括,汇编语言在内的,各种编程语言协同工作。 入栈顺序,只是调用约定的一个方面,不是全部,不是一个独立的议题。
xiangzhihappy 2013-06-23
  • 打赏
  • 举报
回复
学习了
如此美丽的你 2013-06-23
  • 打赏
  • 举报
回复
以前的我也经常问这种无聊的问题,也经常去看c/c++的反汇编觉得很牛B,现在看来自己都觉得非常好笑。 首先对于一个初学者来说研究这种牛角尖的问题毫无意义,要学会"不求甚解",这样会大大提高学习效率,语言只是工具会用就行,应该把时间放在你感兴趣的领域比如数据库或网络... 看到很多人用汇编来研究c/++语言明显是误入歧途,虽然通过汇编看到大多数语句的底层实现,但c/c++毕竟是高级语言,是抽象性的语言,有些抽象概念与汇编是有差异的,比如c函数的反汇编参数的pascal式入栈方式即从右往左依次入栈。但c语言函数的入栈方式真的是从右往左吗?? 看看下面代码:

...
...
void add(int a,int b)
{
   int m=a,n=b;
}
...
int main(...)
{
    int i=10;
    add(i,i++);
....
}
//猜猜 m、n的值??
//这段代码有问题吗??undefined behavior???
通过反汇编来研究c/c++这相当于通过玉米粉来研究玉米的品种,这加工方式就不知道有多少种,这不是坑爹吗???
老王爱上猫 2013-06-23
  • 打赏
  • 举报
回复
学习了,以前都没怎么注意个这个情况...
漫步者、 2013-06-23
  • 打赏
  • 举报
回复
栈上空间不足..
line_us 2013-06-23
  • 打赏
  • 举报
回复
看来问题的症结找到了
皮特尔 2013-06-23
  • 打赏
  • 举报
回复
25楼和27楼的方法都可以试试。
我看你有戏 2013-06-22
  • 打赏
  • 举报
回复
你这个地方爆掉,应该是操作系统觉得你这个堆栈定义得太长了吧,超过了它所管理的范围,那就把你先爆了先
我看你有戏 2013-06-22
  • 打赏
  • 举报
回复
引用 楼主 wangfeng2500 的回复:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXBUF 838000000

int main()
{
    printf("-----------------------handle_message----------------------- \n");
    getchar();
        char buf[MAXBUF + 1];
    return 0;
}
没有打印出------这句话,栈分配不是按照程序运行的先后顺序么?
虚拟内存最多是4G个字节吧,你这个超出了,所以爆掉
hugett 2013-06-22
  • 打赏
  • 举报
回复
爆栈了。。把buf数组改为全局变量。。
锋林 2013-06-22
  • 打赏
  • 举报
回复
引用 15 楼 bigbaldy 的回复:
[quote=引用 6 楼 wangfeng2500 的回复:] [quote=引用 2 楼 bigbaldy 的回复:] 看图你就明白了
没学过汇编[/quote] 进入main后,首先是chkstk,即堆栈分配检测函数,该函数是在所有操作的最前面,所以还没到printf就崩了[/quote]正解,而且在源文件编译为汇编代码时,编译器会对源代码进行优化,所以源代码中的语句顺序和汇编代码中的语句顺序不一定是一样的。
bigbaldy 2013-06-22
  • 打赏
  • 举报
回复
引用 6 楼 wangfeng2500 的回复:
[quote=引用 2 楼 bigbaldy 的回复:] 看图你就明白了
没学过汇编[/quote] 进入main后,首先是chkstk,即堆栈分配检测函数,该函数是在所有操作的最前面,所以还没到printf就崩了
BeanJoy 2013-06-22
  • 打赏
  • 举报
回复
VC++6.0默认栈大小为1M,而局部变量存放在栈中。
因此,char buf[MAXBUF + 1];这句就已经超出一栈的大小。

设置一下,把栈的大小设置为838100000,重新编译就不会崩溃了。
赵4老师 2013-06-22
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。
加载更多回复(19)
零资源分下载,分享精神至上~ 3.0版新加入三维天空模拟系统。 其中的3D人物模型使用的是真三国无双6中的一个女角色。 背景音乐为仙剑奇侠传3主题曲。 一个综合型的Direct3D示例程序的3.0版。 用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存),地形系统模拟,三维天空模拟。 源码的配套博文是 《【Visual C++】游戏开发四十九 浅墨DirectX教程十七 三维天空的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8715196, 点击Release文件夹下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。
零资源分下载,分享精神至上~ 一个综合型的Direct3D示例程序的2.0版。加入绿宝石三维地形模拟系统。 用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存)。 其中的3D人物模型使用的是变形金刚中的大黄蜂。 背景音乐为魔兽3暗夜精灵进行曲。 源码的配套博文是 《【Visual C++】游戏开发笔记四十八 浅墨DirectX教程十六 三维地形系统的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8685546, 点击Release文件夹下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。
零资源分下载,分享精神至上~ 一个综合型的Direct3D示例程序,用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存)。 其中的3D人物模型使用的是PS3版《真三国无双6》中的王元姬 ,一袭蓝衣,很美。 背景音乐为雅尼的《兰花》。 源码的配套博文是 《【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8657656, 点击Debug下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。 by浅墨

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧