我尝试打印简单的c *字符串,如下所示:
char *cc = "HEllo";
for (char* inputPtr = cc; inputPtr[0]; inputPtr++) {
char c = inputPtr[0]++;
printf("%s",c);
}
但我得到: 访问冲突写入位置0x00CFB310。 on:
char c = inputPtr[0]++;
这里有什么问题?
答案 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";
,看看会发生什么。建议的声明声明了一个可修改的字符串缓冲区。