昨天的笔试题目,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'>