const修饰后的存储位置??

时间:2022-12-27 15:32:31
用const修饰的变量存储在那里?
const int i =1; //i存储在那里?
const int j; //j存储在那里?
int main()
{
        const int k = 2;//k存储在那里?
...
...
        return 0;
  } 

16 个解决方案

#1


i,j应该是在堆上。
k分配在栈上。

#2


 帮你顶,我觉得应该i,j都在全局区,k在堆

#3


引用 1 楼 dbger 的回复:
i,j应该是在堆上。
k分配在栈上。


i,j存储在全局区(静态区)。

#4


全部都在常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

#5


C语言里和不加const一样, C++里面不见,可能常量折叠掉了去了文字量区。

#6


引用 4 楼 sc_valentine21 的回复:
全部都在常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

#7


C语言里和不加const一样, C++里面不见得,可能常量折叠掉了去了文字量区。

#8


LZ可以运行一个程序,单步运行,看看各个变量的存储地址就可以了.


i,j在全局区,(静态区)

k在堆上..

#9


我运行的环境是C

#10


这楼主写错了吧
常量const int j; 能不初始化?

#11


引用 10 楼 chlaws 的回复:
这楼主写错了吧
常量const int j; 能不初始化?

有道理
可是我这样用也可以吧
#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文件中找不到,那么会编译出错

#16


受教

#1


i,j应该是在堆上。
k分配在栈上。

#2


 帮你顶,我觉得应该i,j都在全局区,k在堆

#3


引用 1 楼 dbger 的回复:
i,j应该是在堆上。
k分配在栈上。


i,j存储在全局区(静态区)。

#4


全部都在常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

#5


C语言里和不加const一样, C++里面不见,可能常量折叠掉了去了文字量区。

#6


引用 4 楼 sc_valentine21 的回复:
全部都在常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

#7


C语言里和不加const一样, C++里面不见得,可能常量折叠掉了去了文字量区。

#8


LZ可以运行一个程序,单步运行,看看各个变量的存储地址就可以了.


i,j在全局区,(静态区)

k在堆上..

#9


我运行的环境是C

#10


这楼主写错了吧
常量const int j; 能不初始化?

#11


引用 10 楼 chlaws 的回复:
这楼主写错了吧
常量const int j; 能不初始化?

有道理
可是我这样用也可以吧
#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文件中找不到,那么会编译出错

#16


受教