洛城闻笛 发表于 2018-8-1 20:54:28

定义了个字符数组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));
}

无符号整形 发表于 2018-8-1 20:56:20

那个会对齐到32字节就不会溢出啦。

洛城闻笛 发表于 2018-8-1 21:00:00

无符号整形 发表于 2018-8-1 20:56
那个会对齐到32字节就不会溢出啦。

为什么是对齐到32字节呢?我的机子是64位。而且能否解释下内存对齐是怎么一回事,谢谢!

无符号整形 发表于 2018-8-1 21:02:34

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

没有,只有程序是64位的时候才会对齐到32位。(要编译64位程序的话要用vs,cb只能编译32位)
内存对齐就是cpu为了好管理数据(大概是这个原因),就要这样做,否则一块一块的数据零零散散的,根本无法分辨。

关键是感觉 发表于 2018-8-1 21:48:57

溢出了只是你没有报错而已,要想测试这个问题。你在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:01

这个内存搞不懂是怎么分的

无符号整形 发表于 2018-8-2 08:27:21

洛城闻笛 发表于 2018-8-2 00:10
这个内存搞不懂是怎么分的

linux上面的指针是内存位置,Windows上面的指针是应用程序的虚拟内存。
页: [1]
查看完整版本: 定义了个字符数组char[20],但我输入了26个数组,没有溢出怎么回事?