定义了个字符数组char[20],但我输入了26个数组,没有溢出怎么回事?
本帖最后由 洛城闻笛 于 2018-8-1 21:17 编辑#include<stdio.h>
#include <string.h>
int main()
{
char a;
printf("请输入字符串:");
scanf("%[^\n]",a);
printf("a=%s\n",a);
printf("字符串长度=%u",strlen(a));
}
那个会对齐到32字节就不会溢出啦。 无符号整形 发表于 2018-8-1 20:56
那个会对齐到32字节就不会溢出啦。
为什么是对齐到32字节呢?我的机子是64位。而且能否解释下内存对齐是怎么一回事,谢谢! 洛城闻笛 发表于 2018-8-1 21:00
为什么是对齐到32字节呢?我的机子是64位。而且能否解释下内存对齐是怎么一回事,谢谢!
没有,只有程序是64位的时候才会对齐到32位。(要编译64位程序的话要用vs,cb只能编译32位)
内存对齐就是cpu为了好管理数据(大概是这个原因),就要这样做,否则一块一块的数据零零散散的,根本无法分辨。 溢出了只是你没有报错而已,要想测试这个问题。你在char a 前后定义一些变量。溢出后有几率覆盖前后定义的变量
char a;char b;char c;
同一个栈中 申请a空间和b空间和C空间,他们有几率地址之间没有间隙,但是不可抱有侥幸心里,都在栈中,是有几率计算值错误的
#include "stdio.h"
int main(){
char a='a';
char b;
char c='c';
int i;
printf("%p %p %p\n",&a,b,&c);
printf("%d \n",(b)-(&c) );
printf("a=%c c=%c\n",a,c);
for(i=-(b-&c);i<20;i++){
*(b+i)='f';
}
printf("a=%c c=%c\n",a,c);
}
这个内存搞不懂是怎么分的 洛城闻笛 发表于 2018-8-2 00:10
这个内存搞不懂是怎么分的
linux上面的指针是内存位置,Windows上面的指针是应用程序的虚拟内存。
页:
[1]