字符串的溢出问题

前两天写代码的时候遇到了一个问题,在对整型和字符型数据同时赋值的时候,输入的整型数据前后数值发生了变化,代码如下:

#include <stdio.h>

int main() {
	int a, b, c;
	char s[3];
	scanf("%d%d%d", &a, &b, &c);
	printf("第一次输出abc的值%d %d %d\n", a, b, c);
	scanf("%s", s); 
	printf("第二次输出abc以及字符串的值的值%d %d %d %s\n", a, b, c, s);
	return 0;
} 

在这里插入图片描述
如图,输出结果的 c 从 3 变成了 0,但是我整个代码是并未对 c 重新赋值的。

**错因:**C语言规定字符串的结束标志是 ‘\0’,ASCII值为 0,系统会自动在末尾加,所以我们定义的字符串数组长度应该比真实字符串长度多一个。

为了便于理解,我查看了devc对这些数据的内存分配情况:
首先对整型数据 a b c 赋值,未对字符串赋值,如图圈出来的部分,整型占 4 个字节:
在这里插入图片描述
后面对字符串赋值,字符型占1个字节,再查看内存分配情况:
在这里插入图片描述
如图,因为我们没有预先给字符串留出位置添加 ‘\0’ ,导致字符串溢出,占据了原来数值 c 的位置,导致 c 的值变为0。

后面对代码进行修改

#include <stdio.h>

int main() {
	int a, b, c;
	char s[4];//区别在这 
	scanf("%d%d%d", &a, &b, &c);
	printf("第一次输出abc的值%d %d %d\n", a, b, c);
	scanf("%s", s); 
	printf("第二次输出abc以及字符串的值%d %d %d %s\n", a, b, c, s);
	printf("输出字符串最后一个数值%d", s[3]); //我们看一下字符串最后一个位置的ascii值 
	return 0;
} 

运行结果无错:
在这里插入图片描述
查看内存分配情况,先对整型赋值:
在这里插入图片描述
然后对字符串赋值,并查看内存分配情况:
在这里插入图片描述

小知识点

在devc中查看内存分配情况,在调试窗口向gdb发送以下命令:
1.获取某个数值(如数值a)在内存中的地址 : print /x &a;
2.查看某段内存中的值
1)以十进制显示,以某地址为起始单元,返回32 个内存单元:x /32db 内存地址(本文章已演示)
2)以十六进制显示,以某地址为起始单元,返回32 个内存单元:x /32xb 内存地址(文章未演示)

欢迎大家提意见~
如若有错,感谢斧正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的小鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值