免费注册 查看新帖 |

Chinaunix

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

[函数] 关于一个字符串数组拷贝函数的奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-06 14:44 |只看该作者 |倒序浏览
在32位的机器很正常,在64位机器时,只要数组的元素数量大于7(变量a>;7)就会出错,出错代码:ptrptr = q; 百思不得其解,请高手指教

代码如下:
#########################################
#include <stdio.h>;
#include <string.h>;

void StrArrayCpy(char *szString[], char **outString[], int eiElements )
{
    int  size,len,i;
    char **pArray = ( char **)szString;
    char *q, *buffer ;
               
    if( !szString)
        {
                printf("szString is NULL\n";
                return ;
        }
       
    len = sizeof(int) + eiElements * sizeof(int)*3 ;
        for( i=0; i<eiElements; i++ )
        {
                len += ( strlen( szString) + 1 ) ;
                printf("len(%d) += ( strlen( %s) + 1 )\n",len,szString);
        }
       
    size = len ;
        buffer = new char[ size ] ;
        printf("memset( value, 0, size=%d ) ;\n",size);
    memset( buffer, 0, size ) ;
        union
        {
                int   value ;
                char     str[4] ;
        }val;
        val.value = eiElements;
    memcpy( buffer, (void *)(val.str), sizeof( int) ) ;
       
    q = buffer + sizeof(int);
    char *stroffset = q ;
        char **ptrptr = (char **)(q+eiElements * sizeof( int));
        q += eiElements * sizeof( int) * 3 ;
        printf("char **ptrptr = ( char **)q;\n";
        int offset = 0;
        for( i=0; i<eiElements; i++ ) {
                printf("for %d-1 pArray[%d]=%s\n",i,i,pArray);

                val.value = offset;
                printf("offset = %d\n",val.value);
                memcpy( stroffset, (void *)(val.str), sizeof( int) ) ;
                printf("stroffset=%d,ptrptr[%d]=%x,q=%x\n",*(int *)stroffset,i,&ptrptr,q);
                ptrptr = q;
                printf("for %d-2 \n",i);
                strcpy( q, pArray ) ;
                offset += strlen( pArray ) + 1;
                q += strlen( pArray ) + 1 ;
                stroffset += sizeof( int) ;
        }
        *outString = ptrptr;
}

int main()
{

int a=8;
char b[10][256];
char *p[10];
char ** pp;

for(int i=0; i<a; i++)
{
        p = b;
        sprintf(b,"test string %d",i);
        printf("p[%d]=%s\n",i,p);
}

StrArrayCpy(p,&pp, a);

for(int i=0; i<a; i++)
{
        printf("string[%d]=%s\n",i,pp);
}
}

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-11-06 15:31 |只看该作者

关于一个字符串数组拷贝函数的奇怪问题

在我机器上怎么没问题?也是64位的系统,
操作系统为aix5l,编译器为g++。

论坛徽章:
0
3 [报告]
发表于 2003-11-06 16:56 |只看该作者

关于一个字符串数组拷贝函数的奇怪问题

我的机器是hu-ux 11i,安腾2芯片的,也是用g++编译,不过默认编译是32位的,你要加上参数-mlp64才是64代码编译,不知道你是否这样?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-11-06 17:13 |只看该作者

关于一个字符串数组拷贝函数的奇怪问题

[quote]原帖由 "andyboy"]我的机器是hu-ux 11i,安腾2芯片的,也是用g++编译,不过默认编译是32位的,你要加上参数-mlp64才是64代码编译,不知道你是否这样?[/quote 发表:

我加了编译选项-maix64,没问题的。
  1. int a=8;
  2. char b[10][256];
  3. char *p[10];
复制代码

你在改变a的大小时,数组b的第一维大小和指针p的大小是否改变?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP