鱼C论坛

 找回密码
 立即注册
查看: 1461|回复: 6

[已解决]定义了个字符数组char[20],但我输入了26个数组,没有溢出怎么回事?

[复制链接]
发表于 2018-8-1 20:54:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 洛城闻笛 于 2018-8-1 21:17 编辑
  1. #include<stdio.h>
  2. #include <string.h>
  3. int main()

  4. {
  5.     char a[20];
  6.     printf("请输入字符串:");
  7.     scanf("%[^\n]",a);
  8.     printf("a=%s\n",a);
  9.     printf("字符串长度=%u",strlen(a));
  10. }
复制代码
最佳答案
2018-8-1 21:48:57
溢出了只是你没有报错而已,要想测试这个问题。你在char a[20] 前后定义一些变量。溢出后有几率覆盖前后定义的变量
char a;char b[20];char c;
同一个栈中 申请a空间和b空间和C空间,他们有几率地址之间没有间隙,但是不可抱有侥幸心里,都在栈中,是有几率计算值错误的
  1. #include "stdio.h"

  2. int main(){
  3.         char a='a';
  4.         char b[20];
  5.         char c='c';
  6.         int i;

  7.         printf("%p %p %p\n",&a,b,&c);
  8.         printf("%d \n",(b)-(&c) );
  9.         printf("a=%c c=%c\n",a,c);
  10.         for(i=-(b-&c);i<20;i++){
  11.                 *(b+i)='f';
  12.         }
  13.         printf("a=%c c=%c\n",a,c);

  14. }
复制代码

QQ拼音截图20180801214941.png

程序结果

程序结果
wenti.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-1 20:56:20 | 显示全部楼层
那个会对齐到32字节就不会溢出啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-1 21:00:00 | 显示全部楼层
无符号整形 发表于 2018-8-1 20:56
那个会对齐到32字节就不会溢出啦。

为什么是对齐到32字节呢?我的机子是64位。而且能否解释下内存对齐是怎么一回事,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-1 21:02:34 | 显示全部楼层
洛城闻笛 发表于 2018-8-1 21:00
为什么是对齐到32字节呢?我的机子是64位。而且能否解释下内存对齐是怎么一回事,谢谢!

没有,只有程序是64位的时候才会对齐到32位。(要编译64位程序的话要用vs,cb只能编译32位)
内存对齐就是cpu为了好管理数据(大概是这个原因),就要这样做,否则一块一块的数据零零散散的,根本无法分辨。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-1 21:48:57 | 显示全部楼层    本楼为最佳答案   
溢出了只是你没有报错而已,要想测试这个问题。你在char a[20] 前后定义一些变量。溢出后有几率覆盖前后定义的变量
char a;char b[20];char c;
同一个栈中 申请a空间和b空间和C空间,他们有几率地址之间没有间隙,但是不可抱有侥幸心里,都在栈中,是有几率计算值错误的
  1. #include "stdio.h"

  2. int main(){
  3.         char a='a';
  4.         char b[20];
  5.         char c='c';
  6.         int i;

  7.         printf("%p %p %p\n",&a,b,&c);
  8.         printf("%d \n",(b)-(&c) );
  9.         printf("a=%c c=%c\n",a,c);
  10.         for(i=-(b-&c);i<20;i++){
  11.                 *(b+i)='f';
  12.         }
  13.         printf("a=%c c=%c\n",a,c);

  14. }
复制代码

QQ拼音截图20180801214941.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-2 00:10:01 | 显示全部楼层
这个内存搞不懂是怎么分的
Code;;blocks上结果.png
linux上结果.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-2 08:27:21 | 显示全部楼层
洛城闻笛 发表于 2018-8-2 00:10
这个内存搞不懂是怎么分的

linux上面的指针是内存位置,Windows上面的指针是应用程序的虚拟内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 07:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表