免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1803 | 回复: 8
打印 上一主题 下一主题

请教一个strncpy字符串的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-14 09:04 |只看该作者 |倒序浏览
char        acTmp[50] ;
char        acAcct[30] ;
strncpy( acTmp,  acAcct-1, 12 ) ;
这样写是不是非法的阿? “acAcct-1”这个定位,还能支持负数吗?
我在VC++6.0环境下调试,没有错误。
我想问的是acTmp每次得到的值是不是应该是个不确定的值啊?但是我的测试结果好像每次acTmp的值都一样的,这是怎么回事儿!!
忘高手指点。

论坛徽章:
0
2 [报告]
发表于 2006-12-14 09:07 |只看该作者
这样写语法上都是正确的
&acAcct[-1]

论坛徽章:
0
3 [报告]
发表于 2006-12-14 09:11 |只看该作者
语法是没有问题,但是我认为,acAcct[-1]应该是个不确定的内容!
是不是?

论坛徽章:
0
4 [报告]
发表于 2006-12-14 09:25 |只看该作者
acAcct[-1]的值应该是不确定的,每次一样不能说明问题

论坛徽章:
0
5 [报告]
发表于 2006-12-14 10:41 |只看该作者
strncpy( acTmp,  acAcct-1, 12 ) ;

能告诉我 这种情况转换成java应该怎么实现?

论坛徽章:
0
6 [报告]
发表于 2006-12-14 13:18 |只看该作者
原帖由 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);
}

论坛徽章:
0
7 [报告]
发表于 2006-12-14 14:13 |只看该作者
楼上的讲的很深奥,呵呵,有点不懂!!
拿你的代码研究一下先,谢谢了

论坛徽章:
0
8 [报告]
发表于 2006-12-14 15:12 |只看该作者
原帖由 pczxllwxd 于 2006-12-14 14:13 发表
楼上的讲的很深奥,呵呵,有点不懂!!
拿你的代码研究一下先,谢谢了


嗯,我也觉得说的有点罗嗦,主要是把栈结构搞清楚了就好理解了。通过上面那个程序,比较打印出的几个地址,可以大致推测一下栈结构

论坛徽章:
0
9 [报告]
发表于 2006-12-14 15:38 |只看该作者
>> 这样写是不是非法的阿?

回答是肯定的,因为你这是越界访问数组,是一种典型的错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP