C语言遇到的小问题

32为Linux主机下的C语言内存情况

-----------------------------------------------------------          4G(0xffff ffff)

内核空间              应用程序不许访问

------------------------------------------------------------         0xC000 0000

 栈空间                 RW           局部变量保存位置

-------------------------------------------------------------

运行时堆空间                           malloc

--------------------------------------------------------------

全局的数据空间     RW     (初始化的(data)、未初始化的(bss))     data    bss

代码段(只读)           R                code                                text

---------------------------------------------------------------0x0804 8000
---------------------

堆栈区内存大小,Windows下缺省值 2M,如果char够用,你就按照char去开,就只有int的1/4啦,不计算好递归次数或者局部变量大小,若评测机没有特殊配置,您将get stackoverflow(爆栈)

当我们malloc(C++为new)也是能用的,他是在堆里进行调用

bss(block started by symbol)段是用来存放已经初始化为0或者未初始化的全局变量的内存区域

0xC0000000 3GB,以上用于内核、以下用于用户

0x08048000 是加载的地址,0x08048000 以下的地址范围 会用来做 single second-level page table,占用内存可以减少

图片版

 

printf("%s",s[i]) 错误

printf("%s",s[i])不能运行的原因也在这里,给定字符就会访问字符所在ascii值的内存空间,就炸了

导致程序运行崩溃有以下几种可能:非法内存地址访问,访问越界,堆栈溢出

栈(sp),函数调用时入栈的顺序 是参数(arg) 父函数地址(可以回跳回去) 局部变量(local variable)

case 's':
s = va_arg(args, char *);
if (!s)    s = "<NULL>";
len = strnlen(s, precision);
if (!(flags & LEFT)) while (len < field_width--) *str++ = ' ';
for (i = 0; i < len; ++i) *str++ = *s++;
while (len < field_width--) *str++ = ' ';

 打印指针请使用%p,64位机使用%x就出错了,请使用自己的类型

posted @ 2019-05-04 22:22  暴力都不会的蒟蒻  阅读(231)  评论(1编辑  收藏  举报