栈问题

平时杂记1  栈问题

         我简单说一下,在VC6下,栈地址是从高地址方向向低地址方向增长的,x先定义,这个时候假设它占了地址a、a+1、a+2、a+3这四个字节的空间,由于被赋值为35,所以(unsigned char *)(*a)=35,(unsigned char *)(*(a+1))=0,然后定义了char str[10];由于栈里面是4字节对齐的,所以char str[10];实际上分配了12个字节的字节的空间,这个时候str的地址应该为a-12;strcpy(str," www.it315.org"/*共 13 个字母*/);这里实际上是14个字符,," www.it315.o"这12个字符被填充到a-12到a-1,r被填充到a,g被填充到a+1,a+2仍然是0,所以x的值变了。
同时下面的这串代码:
#include <stdio.h>

int main ( int argc, char *argv[] )
{
    int i ;
    int a[10] ;
    
    for ( i = 0 ; I < 10; i++ )
printf ( "%d\n", a[10] ) ;
    return 0 ;
}

这个程序的结果是0, 1, 2, 3, 4, 5, 6,。。。9,开始我也不太明白是这个结果,最后想到是因为变量的进栈顺序的问题,在这个程序里进栈顺序如下图:


在windows上函数变量进栈的方式是由高地址到低地址,而在linux下可能也一样可以测一下。而在定义的时候(如果是数组先给数组分配一个连续的内存块从低地址到高地址)谁先定义谁是高地址,而申请堆存储的时候则是由低到高的,并且最小分配堆大小是16个字节,大于等于16个字节小于24字节都是24字节的空间,以此类推。。。。可得对空间分配的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值