-2

我尝试像这样打印简单的 c* 字符串:

char *cc = "HEllo";

                for (char* inputPtr = cc; inputPtr[0]; inputPtr++) {
                    char c = inputPtr[0]++;
                    printf("%s",c);
                }

但我得到:访问冲突写入位置 0x00CFB310。上 :

char c = inputPtr[0]++;

这里有什么问题?

4

4 回答 4

2

看起来您正在尝试inputPtr[0]替代*inputPtr. 在许多情况下,这两个表达式产生相同的结果。

但是,表达式inputPtr[0]++与 不一样*inputPtr++,因为[0]它的优先级高于*,但它与 suffix 具有相同的优先级++。此优先级内的运算符从左到右应用,因此第一个表达式 post-incrementsinputPtr[0]是字符文字中的一个字符。这是未定义的行为,因此您会看到崩溃。

如果您替换inputPtr[0]++并从循环头中*inputPtr++删除inputPtr++,您的代码将正常工作:

for (char* inputPtr = cc; inputPtr[0]; ) {
    char c = *inputPtr++;
    printf("%c", c); // Replace %s with %c to print one character
}
于 2017-03-04T09:52:40.203 回答
1

inputPtr指向"HEllo",这是一个字符串文字。

不允许修改字符串文字,并且尝试这样做会调用未定义的行为

inputPtr[0]++正在尝试修改字符串文字。如果字符串文字的数据位于只读位置,则可能导致分段错误。

于 2017-03-04T09:50:49.770 回答
0

C 中的字符串文字是只读的,尝试修改字符串文字中的字符会导致未定义的行为

任何与inputPtr[0]你一起修改字符串,因为增加了字符inputPtr[0]

这就是您const char *在指向字符串文字时应始终使用的原因。

如果要修改字符串的内容,则必须创建一个数组:

char cc[] = "HEllo";
于 2017-03-04T09:51:31.980 回答
0

正如其他人所写,您不能修改字符串文字。将您的声明更改为char cc[] = "HEllo";,看看会发生什么。建议的声明声明了一个可修改的字符串缓冲区。

于 2017-03-04T09:52:18.657 回答