const int i =1; //i存储在那里?
const int j; //j存储在那里?
int main()
{
const int k = 2;//k存储在那里?
...
...
return 0;
}
16 个解决方案
#1
i,j应该是在堆上。
k分配在栈上。
k分配在栈上。
#2
帮你顶,我觉得应该i,j都在全局区,k在堆
#3
i,j存储在全局区(静态区)。
#4
全部都在常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
#5
C语言里和不加const一样, C++里面不见,可能常量折叠掉了去了文字量区。
#6
#7
C语言里和不加const一样, C++里面不见得,可能常量折叠掉了去了文字量区。
#8
LZ可以运行一个程序,单步运行,看看各个变量的存储地址就可以了.
i,j在全局区,(静态区)
k在堆上..
i,j在全局区,(静态区)
k在堆上..
#9
我运行的环境是C
#10
这楼主写错了吧
常量const int j; 能不初始化?
常量const int j; 能不初始化?
#11
有道理
可是我这样用也可以吧
#include <stdio.h>
const int i =1; //i存储在那里?
const int j; //j存储在那里?
int main()
{
const int k = 2;//k存储在那里?
int *p = NULL;
p = &j;
*p = 12;
p = NULL;
printf("%d\n", j);
return 0;
}
#12
#include <stdio.h>
const int i = 1;
const int j;
int main(void)
{
const int k = 2;
int l = 3;
printf("%p\n", &i);
printf("%p\n", &j);
printf("%p\n", &k);
printf("%p\n", &l);
return 0;
}
.globl i
.section .rodata
.align 4
.type i,@object
.size i,4
i:
.long 1
......
.Lfe1:
.size main,.Lfe1-main
.comm j,4,4
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
k和l一样,都在stack上...
#13
服了,看了有些回复真的是服了.
#14
全部在静态存储区,没有初始化的在bss区
#15
#include<iostream>
const int g_nA = 1;
const int g_nC = 2;
int _tmain(int argc, _TCHAR* argv[])
{
const int nB = 2;
const int nD = 5;
std::cout<<"&g_nA:"<< &g_nA <<std::endl;
std::cout<<"&g_nC:"<<&g_nC<<std::endl;
std::cout<<"&nB: "<<&nB <<std::endl;
std::cout<<"&nD "<<&nD<<std::endl;
system("pause");
return 0;
}
上面是个测试函数
&g_nA:004B81A0
&g_nC:004B81A4
&nB: 0012FF4C
&nD 0012FF40
请按任意键继续. . .
对于 &g_nA:004B81A0和&g_nC004B81A4 可以看出地址是递增的,是在数据段内
对于:
&nB: 0012FF4C
&nD 0012FF40
地址是递减的,可以说明是在堆栈上的,以为堆栈地址是高到低的!
====================================NB的分割线=====================================
给你几点总结:
1:在函数内部,除了static变量外,所有变量都是保存在堆栈上的
2:const 全部必须申明其值,不如会被认为是 extern 变量,如果在其他obj文件中找不到,那么会编译出错
const int g_nA = 1;
const int g_nC = 2;
int _tmain(int argc, _TCHAR* argv[])
{
const int nB = 2;
const int nD = 5;
std::cout<<"&g_nA:"<< &g_nA <<std::endl;
std::cout<<"&g_nC:"<<&g_nC<<std::endl;
std::cout<<"&nB: "<<&nB <<std::endl;
std::cout<<"&nD "<<&nD<<std::endl;
system("pause");
return 0;
}
上面是个测试函数
&g_nA:004B81A0
&g_nC:004B81A4
&nB: 0012FF4C
&nD 0012FF40
请按任意键继续. . .
对于 &g_nA:004B81A0和&g_nC004B81A4 可以看出地址是递增的,是在数据段内
对于:
&nB: 0012FF4C
&nD 0012FF40
地址是递减的,可以说明是在堆栈上的,以为堆栈地址是高到低的!
====================================NB的分割线=====================================
给你几点总结:
1:在函数内部,除了static变量外,所有变量都是保存在堆栈上的
2:const 全部必须申明其值,不如会被认为是 extern 变量,如果在其他obj文件中找不到,那么会编译出错
#16
受教
#1
i,j应该是在堆上。
k分配在栈上。
k分配在栈上。
#2
帮你顶,我觉得应该i,j都在全局区,k在堆
#3
i,j存储在全局区(静态区)。
#4
全部都在常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
#5
C语言里和不加const一样, C++里面不见,可能常量折叠掉了去了文字量区。
#6
#7
C语言里和不加const一样, C++里面不见得,可能常量折叠掉了去了文字量区。
#8
LZ可以运行一个程序,单步运行,看看各个变量的存储地址就可以了.
i,j在全局区,(静态区)
k在堆上..
i,j在全局区,(静态区)
k在堆上..
#9
我运行的环境是C
#10
这楼主写错了吧
常量const int j; 能不初始化?
常量const int j; 能不初始化?
#11
有道理
可是我这样用也可以吧
#include <stdio.h>
const int i =1; //i存储在那里?
const int j; //j存储在那里?
int main()
{
const int k = 2;//k存储在那里?
int *p = NULL;
p = &j;
*p = 12;
p = NULL;
printf("%d\n", j);
return 0;
}
#12
#include <stdio.h>
const int i = 1;
const int j;
int main(void)
{
const int k = 2;
int l = 3;
printf("%p\n", &i);
printf("%p\n", &j);
printf("%p\n", &k);
printf("%p\n", &l);
return 0;
}
.globl i
.section .rodata
.align 4
.type i,@object
.size i,4
i:
.long 1
......
.Lfe1:
.size main,.Lfe1-main
.comm j,4,4
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
k和l一样,都在stack上...
#13
服了,看了有些回复真的是服了.
#14
全部在静态存储区,没有初始化的在bss区
#15
#include<iostream>
const int g_nA = 1;
const int g_nC = 2;
int _tmain(int argc, _TCHAR* argv[])
{
const int nB = 2;
const int nD = 5;
std::cout<<"&g_nA:"<< &g_nA <<std::endl;
std::cout<<"&g_nC:"<<&g_nC<<std::endl;
std::cout<<"&nB: "<<&nB <<std::endl;
std::cout<<"&nD "<<&nD<<std::endl;
system("pause");
return 0;
}
上面是个测试函数
&g_nA:004B81A0
&g_nC:004B81A4
&nB: 0012FF4C
&nD 0012FF40
请按任意键继续. . .
对于 &g_nA:004B81A0和&g_nC004B81A4 可以看出地址是递增的,是在数据段内
对于:
&nB: 0012FF4C
&nD 0012FF40
地址是递减的,可以说明是在堆栈上的,以为堆栈地址是高到低的!
====================================NB的分割线=====================================
给你几点总结:
1:在函数内部,除了static变量外,所有变量都是保存在堆栈上的
2:const 全部必须申明其值,不如会被认为是 extern 变量,如果在其他obj文件中找不到,那么会编译出错
const int g_nA = 1;
const int g_nC = 2;
int _tmain(int argc, _TCHAR* argv[])
{
const int nB = 2;
const int nD = 5;
std::cout<<"&g_nA:"<< &g_nA <<std::endl;
std::cout<<"&g_nC:"<<&g_nC<<std::endl;
std::cout<<"&nB: "<<&nB <<std::endl;
std::cout<<"&nD "<<&nD<<std::endl;
system("pause");
return 0;
}
上面是个测试函数
&g_nA:004B81A0
&g_nC:004B81A4
&nB: 0012FF4C
&nD 0012FF40
请按任意键继续. . .
对于 &g_nA:004B81A0和&g_nC004B81A4 可以看出地址是递增的,是在数据段内
对于:
&nB: 0012FF4C
&nD 0012FF40
地址是递减的,可以说明是在堆栈上的,以为堆栈地址是高到低的!
====================================NB的分割线=====================================
给你几点总结:
1:在函数内部,除了static变量外,所有变量都是保存在堆栈上的
2:const 全部必须申明其值,不如会被认为是 extern 变量,如果在其他obj文件中找不到,那么会编译出错
#16
受教