循环 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
}
我尝试像这样打印简单的 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
}