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

时间:2017-03-04 09:48:22

标签: c char-pointer

我尝试打印简单的c *字符串,如下所示:

char *cc = "HEllo";

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

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

char c = inputPtr[0]++;

这里有什么问题?

4 个答案:

答案 0 :(得分:2)

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

但是,表达式inputPtr[0]++*inputPtr++不同,因为[0]具有higher precedence而不是*,但它具有与后缀相同的优先级{ {1}}。此优先级中的运算符从左到右应用,因此第一个表达式后递增++,即字符文字内的字符。这是未定义的行为,因此您会看到崩溃。

如果您将inputPtr[0]替换为inputPtr[0]++并从循环标题中删除*inputPtr++,那么您的代码将正常运行:

inputPtr++

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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

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

char cc[] = "HEllo";

答案 3 :(得分:0)

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