昨天的笔试题目,c语言字符串是比较基础的问题,但是有个题目不确,定回来试了一下,更加纠结了
题目:
char a[10]; char *b = "1234567890" // 10位 strcpy(a,b); printf("%s",a)
笔试前也看了strcpy的实现,这个函数不做长度判断,以第二个字符串的结尾'\0'为终止。
我当时想的是 字符串b后面还有一个'\0',复制以后a就变成了没有'\0'结尾的字符串,我写的答案是 输出1234567890@#¥%……直到遇到有'\0'为止,
回来试了下,发现不是我想得那样,只输出了 1234567890
我又把b改成 char *b="1234567890abcdefg" 发现输出 1234567890abcdefg ,竟然没报错,我把b又加长了几位,报了段错误,用gdb看了一下,是 stack smashing detected ,大概是缓冲区溢出的意思,但是接下来的让我更晕乎了
(gdb) l 1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char a[10]; 6 char *b="1234567890abcdefghjkasdasd"; 7 strcpy(a,b); 8 printf("%s\n",a); 9 return 0; 10 } (gdb) break 6 Breakpoint 1 at 0x400604: file test_char.c, line 6. (gdb) r Starting program: ~/Code/test Breakpoint 1, main () at test_char.c:6 6 char *b="1234567890abcdefghjkasdasd"; (gdb) n 7 strcpy(a,b); (gdb) 8 printf("a:%s\n",a); (gdb) p a $1 = "1234567890" (gdb) n a:1234567890abcdefghjkasdasd 9 return 0; (gdb)
为毛这里面gdb 输出 和printf输出不一样啊
有没有了解的大神啊,来交流一下
写对的程序跑起来是对的。写错的程序有时候对,有时候错,什么情况都会发生。你知道它溢出就行了。<divclass='ref'>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。