【问题标题】:C runtime error (undefined behaviour) for performing ++*(p++) on string literal char *p = "abcd"对字符串文字 char *p = "abcd" 执行 ++*(p++) 的 C 运行时错误(未定义行为)
【发布时间】:2014-07-06 10:33:50
【问题描述】:

问题一:

int main()
{
  char *p="abcd";
  printf("%c",*(p++));
  return 0;
}  // Here it will print a

问题 2:

int main()
{
  char *p="abcd";
  printf("%c",++*(p++));//why it is showing error over here
  return 0;
} // Here it shows runtime error.

有人可以向我解释一下为什么语句 ++*(p++) 会导致运行时错误。

【问题讨论】:

  • 为了将来参考,请包括您收到的确切错误。只是习惯于处理更复杂的问题。它将加快流程,您将避免被否决。
  • 为什么要编写不可读的代码?
  • @EdHeal:当然是要参加 IOCCC 比赛 :)
  • 包括,预期的结果是什么。如果你不指定程序应该做什么,就不会出现错误,不会出现奇怪的行为。
  • 它会导致哪个“运行时错误”。换句话说,你的程序的输出是什么?

标签: c pointers


【解决方案1】:
char *p="abcd";

"abcd" 是字符串文字,字符串文字在 C 中是不可修改的。尝试修改字符串文字会调用未定义的行为。

使用由字符串文字初始化的可修改数组来解决您的问题:

char p[] ="abcd";

【讨论】:

  • 所以我们可以在c中修改所有文字。
  • @KerrekSB 如果您要学究气,请按照适当的标准进行操作。声明不是 C 中的语句。声明和语句是复合语句(又名块)中的邻居(C99 6.8.2:1)
  • @KerrekSB 严格来说它是 C++ 中的声明语句,但在 C 中它不是语句而是声明。
  • @PascalCuoq:我指的是C\C++ standard。 :-S
  • @ouah; ...但在 C 中它不是声明而是声明:我认为在 C 中它的声明和定义一样。
【解决方案2】:

字符串文字是只读的。任何修改它的尝试都会调用未定义的行为
在第二个代码中,您正在修改导致程序 未定义行为 的字符串文字。

【讨论】:

    【解决方案3】:

    ++*(p++) - 这相当于++*p;p++;

    所以这里存储在变量p 中的地址的第一个字节值(字符)将增加1。然后变量 p 的值将增加,这意味着 p 将指向(存储)字符串文字的第二个字符("abcd")的地址。

    现在通过下面的两个变量声明。

    char *p = "abcdef"; 
    char p1[] = "abcdef"
    
    • 这里对于第一个变量p,将在堆栈中分配4个字节到 存储字符串文字 "abcdef" 的地址,然后 6 字节将 分配以将字符串文字 ("abcdef") 存储在进程内存的文本段中。始终文本段是只读的。所以这个值不能修改。

    • 那么对于第二个变量 6 字节将被分配到堆栈本身 存储字符串 ("abcdef")。进程内存中的堆栈段同时具有 读写权限。

    所以执行++*p(修改地址中的值)适用于变量p1,但不适用于变量p

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2021-03-18
      • 2023-03-14
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多