c - 这是未定义的行为(使用字符串文字)

标签 c compiler-errors compiler-warnings

#include<stdio.h>

int main()
{ 
   char *s = "Abc";
   
   while(*s)
      printf("%c", *s++);
   
   return 0;
}
我已经(在站点上)看到了正确的代码,但是我认为这是未定义的行为。
我的理由:
这里s存储字符串文字Abc的地址。因此,在遍历while循环时:
  • 迭代-1:
    在这里*(s++)将存储在s中的地址递增1,并返回未递增的地址(即s的先前/原始值)。因此,没问题,一切正常,并打印Abc
  • 迭代-2:
    现在,s指向一个完全不同的地址(可能有效或无效)。现在,当尝试执行while(*s)时,它不是undefined behavior吗?

  • 任何帮助将非常感激!

    最佳答案

    Iteration - 1:

    Here *(s++) increments the address stored in s by 1 and returns the non-incremented address (i.e the previous/original value of s). So, no problem everything works fine and Abc is printed.


    不,不打印“Abc”。 %c告诉printf期望一个字符值并打印出来。它只打印一个字符,而不是字符串。最初,s指向"Abc"的第一个字符。 s++将其递增以指向下一个字符。

    Iteration - 2:

    Now s points to a completely different address (which may be either valid or not). Now when trying to perform while(*s) isn't it undefined behavior ?


    在迭代2中,s指向“b”。
    您可能已经在考虑某些char **p,而*p已设置为指向"abc"的指针。在那种情况下,增加p会将其更改为指向不同的指针(或指向不受控制的内存),这将会出现问题。事实并非如此;对于char *ss指向单个字符,并对其进行递增调整以指向下一个字符。

    关于c - 这是未定义的行为(使用字符串文字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62984267/

    相关文章:

    c++ - clang 给我警告标志更改,但是代码仍然会产生正确的输出

    c++ - 为什么编译器会警告隐藏初始化列表中的成员?

    c++ - 为什么someNumber = rand()&100 + 1;不会产生错误?

    c++ - C/C++ 中的数值转换

    C++编译器模板错误信息-解码错误信息的工具

    c - 包含行和列的乘法表

    c# - 安装项目后出现C#错误

    c++ - 是否有解决数组中无效八进制数字的方法?

    持续监控 Systemd 日志

    c - 是否可以将 C 指针初始化为 NULL?