gpt4 book ai didi

c - 常量、文字和全局变量从哪里获得空间

转载 作者:太空宇宙 更新时间:2023-11-04 05:43:29 26 4
gpt4 key购买 nike

我最近了解到可以使用指针更改 c 中常量的值,但不能更改字符串文字。可能的解释在于,常量和其他字符串在空间中的可修改区域中分配空间,而字符串文字在空间中的不可修改区域(可能是代码段)中分配空间。我写了一个程序来显示这些变量的地址。还显示了输出。

#include <stdio.h>
int x=0;
int y=0;

int main(int argc, char *argv[])
{
const int a =5;
const int b;
const int c =10;
const char *string = "simar"; //its a literal, gets space in code segment
char *string2 = "hello";
char string3[] = "bye"; // its array, so gets space in data segment
const char string4[] = "guess";
const int *pt;
int *pt2;

printf("\nx:%u\ny:%u Note that values are increasing\na:%u\nb:%u\nc:%u Note that values are dec, so they are on stack\nstring:%u\nstring2:%u Note that address range is different so they are in code segment\nstring3:%u Note it seems on stack as well\nstring4:%u\n",&x,&y,&a,&b,&c,string,string2,string3,string4);
}

enter image description here

请解释这些变量究竟从哪里获得空间??全局变量从哪里获取空间,常量从哪里获取,字符串文字从哪里获取??

最佳答案

“可能”夸大了情况。

您可以编写尝试修改 const 对象的代码(例如,将其地址强制转换为指向非常量类型的指针)。您还可以编写尝试修改字符串文字的代码。

在这两种情况下,您的代码都有未定义的行为,这意味着标准不关心会发生什么。实现可以做它想做的事,而发生的事情通常是其他重要事情的意外副作用。你不能依赖这种行为。简而言之,该代码是错误的。这对于定义为 const 的对象和字符串文字都是如此。

可能是在特定的实现上,效果是改变对象或字面量。可能是在另一个实现上,您遇到访问错误并且程序崩溃。可能是在第三种实现中,您有时会得到一种行为,而在其他时候会得到另一种行为。可能会发生完全不同的事情。

变量获取空间的位置是特定于实现的,但在典型的实现中:

  • xy 在一个可修改的数据段中
  • a 在堆栈上。如果不是因为你获取了它的地址,那么变量存储可以完全优化掉,并且值 5 在编译器为代码发出的任何 CPU 指令中用作立即值使用 a
  • b 我认为是一个错误 -- 未初始化的 const 对象。也许这是允许的,但编译器可能应该发出警告。
  • c在栈上,和a一样。
  • 文字“simar”等都位于代码段、只读数据段或可修改数据段(如果实现不影响 rodata)。
  • string3string4 是堆栈上的数组。每个都通过复制字符串文字的内容进行初始化。

关于c - 常量、文字和全局变量从哪里获得空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com