【问题标题】:Looping char* gives me Access violation writing location 0x00CFB310循环 char* 给我访问冲突写入位置 0x00CFB310
【发布时间】:2017-03-04 09:48:22
【问题描述】:

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

char *cc = "HEllo";

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

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

char c = inputPtr[0]++;

这里有什么问题?

【问题讨论】:

  • @dandan78 这不是一个好的复制品,因为 OP 没有意识到他在增加字符,而不是指针。

标签: c char-pointer


【解决方案1】:

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

但是,表达式inputPtr[0]++*inputPtr++ 不同,因为[0]higher precedence 具有*,但它与后缀++ 具有相同的优先级。此优先级内的运算符从左到右应用,因此第一个表达式后递增 inputPtr[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
}

【讨论】:

  • inputPtr[0]++ 更改为*inputPtr++ 的代码将调用未定义行为 以读取超出范围。 inputPtr 现在每个循环增加两次,并且将跳过终止的空字符。
  • @MikeCAT 你说得对,他正在做一个for 循环,而不是while 循环,这样更有意义。谢谢!
  • 我正在获取访问冲突读取位置 0x00000048。在 printf 上
  • @user63898 那是因为你用%s 代替了%c。已编辑。
【解决方案2】:

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

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

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

【讨论】:

  • 你可以建议修复 char cc[] = "HEllo"; 然后
  • @Jean-FrançoisFabre 为什么inputPtr[0] + 1 会在这里产生同样的效果。
  • 好点。我做了一些选择性阅读。为什么要就地修改一些输入数据?有人应该向 OP 提出建议,而不是仅仅指出错误(这使得这是一个重复的问题)
  • @AnttiHaapala 我不认为inputPtr[0] + 1 会产生相同的效果,因为在原始代码中使用了后增量并且inputPtr[0],而不是inputPtr[0] + 1 将存储到c 如果inputPtr[0] 是可写的。
【解决方案3】:

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

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

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

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

char cc[] = "HEllo";

【讨论】:

  • 这个字符指针实际上是从 API 调用中得到的,那么我该如何循环呢?我需要将其复制到 char[] 吗?
  • @user63898 如果你想修改字符串的内容,那么是的,你一定要创建一个副本。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2020-09-04
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多