我不确定为什么strcat在这种情况下适用于我: char* foo="foo";printf(strcat(foo,"bar")); 它成功地为我打印“foobar”. 但是,根据此处讨论的stackoverflow上的早期主题:I just can’t figure out 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.