字符串文字和strcat
发布时间:2020-12-16 09:21:13 所属栏目:百科 来源:网络整理
导读:我不确定为什么strcat在这种情况下适用于我: char* foo="foo";printf(strcat(foo,"bar")); 它成功地为我打
我不确定为什么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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |