循环 char* 给我访问冲突写入位置 0x00CFB310

Looping char* gives me Access violation writing location 0x00CFB310

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

char *cc = "HEllo";

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

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

char c = inputPtr[0]++;

这里有什么问题吗?

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

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

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

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

任何 inputPtr[0]do 修改字符串因为你增加字符 inputPtr[0].

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

如果你想修改字符串的内容你必须创建一个数组:

char cc[] = "HEllo";

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

您似乎正在试验 inputPtr[0] 作为 *inputPtr 的替代品。在许多情况下,这两个表达式产生相同的结果。

然而,表达式inputPtr[0]++*inputPtr++并不相同,因为[0]*具有higher precedence,但它具有与*相同的优先级后缀 ++。此优先级内的运算符被应用 left-to-right,因此第一个表达式 post-increments inputPtr[0] 是字符文字中的一个字符。这是未定义的行为,因此您会看到崩溃。

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

for (char* inputPtr = cc; inputPtr[0]; ) {
    char c = *inputPtr++;
    printf("%c", c); // Replace %s with %c to print one character
}