开发者社区> 问答> 正文

c语言字符串问题,缓冲区溢出?报错

昨天的笔试题目,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输出不一样啊

有没有了解的大神啊,来交流一下

展开
收起
爱吃鱼的程序员 2020-06-20 17:31:51 659 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    写对的程序跑起来是对的。写错的程序有时候对,有时候错,什么情况都会发生。你知道它溢出就行了。<divclass='ref'>

    引用来自“周翼翼”的评论

    写对的程序跑起来是对的。写错的程序有时候对,有时候错,什么情况都会发生。你知道它溢出就行了。嗯嗯,原理比较重要,就是想做到knowwhat,knowwhy。哈。鬼叔也是夜猫子,哈哈。个人觉得,那是因为gdb的p和print的工作原理不一样。print是打印到结束符。而gdb应该是知道a是10长度的字符串。所以只打印了这部分。我也是这么觉得,昨天还下载了gdb的代码,奈何功力不够,看不懂啊

    2020-06-20 17:32:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载