- 论坛徽章:
- 0
|
原帖由 pczxllwxd 于 2006-12-14 09:04 发表
char acTmp[50] ;
char acAcct[30] ;
strncpy( acTmp, acAcct-1, 12 ) ;
这样写是不是非法的阿? “acAcct-1”这个定位,还能支持负数吗?
我在VC++6.0环境下调试,没有错误。
我想问的是acTmp每次得到的值 ...
acAcct[-1]这种用法一般是在二维数组中,反向移动指针不超过数组范围时才有实际意义。
如果你是在intel的处理器上,由于是小端机器,栈向低地址增长,从你的程序的来看,acAcct[-1]指向了栈上一个用于栈对齐填充的字节。如果我们不考虑栈对齐,acAcct[-1] 指向strncpy的第三个参数,acAcct[30]应该就覆盖acTmp的最后一个元素。当然,由于有栈对齐,acAcct[-1]实际指向了一个用于填充的内容的地址。
假设你用的intel的cpu,假设你的栈是16字节对齐(我的机子就是16字节对齐),再假设栈从地址0 开始,你的栈结构应该是:
0x0 acTmp[1]
0x1 acTmp[2]
………………
0x31 acTmp[49]
0x32 垃圾数据,用于对齐
………………
0x40 acAcct[0]
………………
0x5E acAcct[29]
………………
0x60 actmp(传给strncpy函数的第三个参数“12”临时变量的地址)
所以从上面假设出来的栈来看,你acAcct[-1]就指向了0x3F这个地址,内容是垃圾。之所以每次一样,只是因为该地址没被其他程序用到而已。
你可以用类似下面的程序来探测一下自己的栈结构,就可以得出合理的解释了:
#include <stdio.h>
void p_ptr(int val)
{
printf("val addr:%p\n", &val);
}
int main()
{
char p1[] = "aaaaaaaaaaaaaaa";
char p2[] = "bbbbbbbbbbbbbbb";
p_ptr(2);
printf("p2[-1] addr:%p\n", &p2[-1]);
printf("p1 addr:%p\n", p1);
printf("p2 addr:%p\n", p2);
} |
|