C:两个阵列初始化之间的差异

时间:2014-06-08 04:23:05

标签: c pointers

为什么这两个数组初始化之间存在差异?

char *message = "HELLO";

if(message[0] == 'H'){
    // true
}

好的,这很有效。但这不是:

char message[6] = "HELLO";

if(message[0] == 'H'){
    // false
}

他们不是在表达同样的事情吗?

2 个答案:

答案 0 :(得分:0)

"HELLO"的类型为const char *。但由于历史原因,这可以被视为char *。

char messagd[6]是堆栈中的字符数组。一个不同的野兽。

您需要使用strcpy来填充该数组

答案 1 :(得分:0)

在第一个代码片段中,message是指向只读字符数组的指针。你可以修改指针(例如++message没问题),但你不能修改它指向的内容(message[0] = 'X'调用未定义的行为)。

在第二个代码片段中,message是带有初始化器的字符数组。您无法修改变量(++message无效),但您可以修改数组的内容(message[0] = 'X'很好)。

同样sizeof(message)可能会有所不同。

当您只是访问message[0]时,它们的行为相似;也就是说,要么你的声明行为错了,要么编译器有一个非常令人惊讶的错误。

但它们是不同的东西,并且在几个方面表现不同,其中一些我刚才列举过。