当前位置 : 主页 > 编程语言 > c++ >

字符串文字和strcat

来源:互联网 收集:自由互联 发布时间:2021-06-23
我不确定为什么strcat在这种情况下适用于我: char* foo="foo";printf(strcat(foo,"bar")); 它成功地为我打印“foobar”. 但是,根据此处讨论的stackoverflow上的早期主题:I just can’t figure out strcat 它说
我不确定为什么strcat在这种情况下适用于我:

char* foo="foo";

printf(strcat(foo,"bar"));

它成功地为我打印“foobar”.

但是,根据此处讨论的stackoverflow上的早期主题:I just can’t figure out strcat

它说,上面不应该工作,因为foo被声明为字符串文字.相反,它需要被声明为一个缓冲区(一个预定大小的数组,以便它可以容纳我们正在尝试连接的另一个字符串).

在这种情况下,为什么上述程序成功地为我工作?

此代码调用未定义行为(UB),这意味着您无法保证将发生什么(此处失败).

原因是字符串文字是不可变的.这意味着它们不是可变的,任何这样做的尝试都会调用UB.

注意UB会出现什么困难的逻辑错误,因为它可能会起作用(今天和你的系统),但它仍然是错误的,这很可能你可能会错过错误,并且因为一切都很好而相处.

PS:在这个Live Demo中,我很幸运能得到分段错误.我说幸运,因为这个seg错误会让我调查和调试代码.

值得注意的是,海湾合作委员会没有发出任何警告,而且Clang的警告也无关紧要:

p

rog.c:7:8: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
printf(strcat(foo,"bar"));
       ^~~~~~~~~~~~~~~~~
prog.c:7:8: note: treat the string as an argument to avoid this
printf(strcat(foo,"bar"));
       ^
       "%s", 
1 warning generated.
网友评论