变量是在编译时就指定了内存地址还是在运行时由系统指定内存地址的?(关于谭浩强指针章节里的一个疑问)

2024-12-16 09:24:34
推荐回答(4个)
回答1:

地址分为线性地址和物理地址,编译后分配的是线性地址,物理地址是实际内存的地址,线性地址和物理地址的转换由操作系统完成,所以同样的程序运行的物理地址不是固定的

回答2:

你没有理解“确定”的含义。它不是指的“必须”指定的内存地址,而是在编译时由编译器计算出的。编译器根据现有的硬件环境和系统资源占用的情况,在不影响这些资源使用的情况下随机分配出的。所以这里的“确定”指的是在使用变量之前,编译器已经指定了相应的内存地址,而程序员并不关心究竟指向哪个存储单元。因此在不同的机器上运行同一段代码,指向的内存地址可能是不同的。

回答3:

LZ这个问题真的让我楞了。想了一会有了这样的看法。
假如是在编译时分配,那么程序编译之后不运行,岂不是内存得不到释放,而很多程序员都是不会轻易关机的,他们的电脑岂不是卡的很。所以我觉得应该是在运行的时候分配内存的,刚才用自己电脑定义了个变量,编译后只运行输出的是一个值,这突然让我觉得时编译给的内存,但是我又编译执行了几次,给的值和刚刚的一样。这个例子只能说明这块内存是很空闲的,所以每次都分配给了他吧。但我还是觉得试运行时分配的,而编译应该只是指向了内存(具体的不清楚,汇编还没学),运行的时候很可能操作系统会进行判断,如果被占应该会顺延,或者其他的方式,很想数据结构中的一种查找方式(具体忘了)。觉得应该是。欢迎大佬吊打。

回答4:

编译器会自动给变量分配地址,不代表,分配的地址是固定的。例如,在A机子上分配的是2000,在B机子上就不一定是2000了,也有可能是3000