加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

字符串文字和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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读