- 主题:gcc竟然把未初始化的int局部变量直接初始化为0
这不是gcc默认的行为,你把栈覆写之后,再声明就不是0了
--
FROM 61.48.14.*
以前有vs的时候好像反过来的
【 在 blessman (奇怪了) 的大作中提到: 】
: release不会,debug会
: 【 在 foliver 的大作中提到: 】
: : 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: : 然后写个测试程序,gcc下果然是0。
--
FROM 36.21.6.*
别把未定义的行为碰到一次预期的值就觉得理所当然的。laziogo已经给出证明的情况了。要看这块内存之前的情况。
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
--
修改:brucewww FROM 202.85.208.*
FROM 202.85.208.*
未定义
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
:
: 然后写个测试程序,gcc下果然是0。
:
: Ubuntu16.04下测试的
: --来自微水木3.5.10
: --
:
发自「今日水木 on 23116PN5BC」
--
FROM 124.64.22.*
寄存器一样看反汇编的指令就行了
【 在 fayewong 的大作中提到: 】
: 这是stack甚至有可能被优化成寄存器
--
FROM 114.241.228.*
大神……
【 在 z16166 的大作中提到: 】
: 这很简单就能确认是不是gcc干的,反汇编看一下release版的ELF文件那里填写的是啥
: bss段一般没东西
--
FROM 111.18.138.*
明显有背 0开销 原则的事,c/c++ 都不会干
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
--
FROM 111.222.57.*
【 在 foliver 的大作中提到: 】
: 起因是有一个程序到vs下调试,直接报未初始化下标数组越界。可是这在linux下运行的很好啊。一看代码,果然没有初始化。
: 然后写个测试程序,gcc下果然是0。
: Ubuntu16.04下测试的
你这是用的多大的数组,
通常所谓局部变量初始化, 无非就是移动一下栈指针, 换句话就是把栈寄存器指针计数做个减法运算,
都犯不着操作内存。
--
FROM 115.171.155.*
【 在 laziogo 的大作中提到: 】
: 输出都是3,没有初始化为0啊。 linux gcc, debug
: void foo() {
: int a;
: ...................
这样,先运行foo,是 0
int main()
{
foo();
bar();
return 0;
}
--
FROM 111.198.66.*
试了,编译的时候 加上-O1,会被置零。
不加,随机数。
--
FROM 111.198.66.*