char *,char []和const char * - 堆栈,代码段和编译器行为

时间:2015-09-27 11:22:24

标签: c pointers c-strings

所以我在某处读到,声明字符串如:

char * string="someString";

不应该使用,而是应该使用以下内容:

const char* string = "someString";

我不确定为什么这是一个更好的方法,因为我无法改变以第二种方式声明的字符串。

此外,当我使用简单时,我从未遇到过任何问题:

char string[] = "someString";

当我想让字符串保持不变时,我使用了以下内容:

const char string[] = "someString";

所以我写了一个简单的程序,以便了解发生了什么事情:

#include <stdio.h>

int main(void)
{
    const char* someString = "someString";
    char anotherString[] = "someString1";
    char* yetAnotherString = "someString2";
    const char yetyetAnotherString[] = "somestring3";

    printf("someString pointer = %p\n", someString);
    printf("anotherString = %p\n", anotherString);
    printf("yetAnotherString pointer = %p\n", yetAnotherString);
    printf("yetyetAnotherString = %p\n", yetyetAnotherString);

    return 0;
}

我得到的是:

someString pointer = 000000013F2870B0
anotherString = 000000000017FD50
yetAnotherString pointer = 000000013F2870D0 //next to someString pointer
yetyetAnotherString = 000000000017FD60// next to anotherString

这表明使用指针显式声明的字符串与使用表语法声明的字符串完全不同,尽管我们知道表只是普通的指针。

我在互联网上搜索了一下这一点,发现第一种和第三种方法可以在代码段中分配字符串,而其他方法在堆栈上分配它,这可以解释为什么我们不应该用

char * string = "xyz";

因为它将“允许”我们更改代码段中的数据,这是不允许的。

这是我设法理解所有这些事情,但我找不到以下答案:

为什么编译器允许在代码段中分配字符串(在本例中),如果我明确说明以后我希望能够更改指针所指向的值?编译器应该知道这个,为什么要这样做呢?如果我使用表语法,如果两者实际上只是简单地声明指针,那么编译器如何知道该怎么做?

0 个答案:

没有答案