【发布时间】:2020-04-07 04:33:25
【问题描述】:
我目前在 C 类中,对字符串文字的存储位置感到非常困惑。我知道字符串只是一个字符数组,所以类似于
char c[5] = {'A','B','C','D', 0};
等价于
char* c = "ABCD";
编辑:后续问题:
char c[5] = {'A','B','C','D', 0};
如果我现在说 c+1,这是指向字符“B”的指针吗?但是“B”在堆栈中吗?还是在内存的代码部分?
但是当我们说字符串字面量存储在内存的代码部分时,我总是对它的含义感到困惑。
我理解栈和堆的区别,但是对内存的代码段的概念我没把握。
例如,我知道,在上面的示例中,c 只是一个堆栈变量。美好的。但是如果我说 c[0] 呢?这是否存储在内存的代码部分中?或者,在我给出的第二个例子中,使用 char * c = "ABCD",c 本身是一个堆栈变量,但它指向内存代码段中的字符?
我完全糊涂了,任何见解都将不胜感激。
谢谢
【问题讨论】:
-
前两个示例 not 与您的声明相反,因为在第一种情况下,它是一个字符串 constant (可能被存储在代码部分),而第二个是初始化数组。
-
如果你在函数内部声明这个
char c[5] = {'A','B','C','D', 0};(例如main()),它将在堆栈中。在这种情况下,char* c = "ABCD";“ABCD”将在您编译程序时存储在内存中。但是“ABCD”的地址将存储在变量c内的堆栈中(如果您在函数内声明此变量)。 -
嗯 Vladimir 是的,这是有道理的,那么如果我声明 char c[5] = {'A', 'B', 'C', 'D', 0}; c+1 会指向什么?它指向的'B'是否在堆栈中?还是在代码中?
-
c存储在堆栈中。如果您这样做c+1,您将获得第二项“B”的地址。当然这个地址会在栈中,因为变量c在栈中。
标签: c arrays char c-strings string-literals