【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3639|回复: 9

[算法/加密解密] [求助]字符指针数组问题

[复制链接]
发表于 2009-12-11 11:16:05 | 显示全部楼层 |阅读模式
[BR]从turbo c中移植一段程序到vc++6.0,原有程序中定义了一个字符指针数组unsigned char *Str[]={"aaaa", "bbbbb","ccc","dddddd"},我将Str作为某个类A的成员变量,在该类的构造函数中对其作初始化, 程序如下: 在*.h中     class A   {     private:     unsigned char *Str[];     .......   } 在*.cpp中     A::A   {     strcpy(Str[0], "aaaa");     strcpy(Str[1], "bbbbb");     strcpy(Str[2], "ccc");     strcpy(Str[3], "dddddd");   } 出现一个警告和一个错误: warning C4200: nonstandard extension used : zero-sized array in struct/union error C2664: 'strcpy' : cannot convert parameter 1 from 'unsigned char *' to 'char *' 这是什么原因,怎么修改? 如果*.cpp改成:   A::A   {     *Str[]={"aaaa", "bbbbb","ccc","dddddd"};   } 则出现一个警告和三个错误: warning C4200: nonstandard extension used : zero-sized array in struct/union syntax error : ']' syntax error : missing ';' before '{' error C2143: syntax error : missing ';' before '}' 这又怎么改?能说明原因吗? 在类中怎么声明字符指针数组,在那里初始化数组?
 楼主| 发表于 2009-12-11 11:16:05 | 显示全部楼层 |阅读模式
[BR]从turbo c中移植一段程序到vc++6.0,原有程序中定义了一个字符指针数组unsigned char *Str[]={"aaaa", "bbbbb","ccc","dddddd"},我将Str作为某个类A的成员变量,在该类的构造函数中对其作初始化, 程序如下: 在*.h中     class A   {     private:     unsigned char *Str[];     .......   } 在*.cpp中     A::A   {     strcpy(Str[0], "aaaa");     strcpy(Str[1], "bbbbb");     strcpy(Str[2], "ccc");     strcpy(Str[3], "dddddd");   } 出现一个警告和一个错误: warning C4200: nonstandard extension used : zero-sized array in struct/union error C2664: 'strcpy' : cannot convert parameter 1 from 'unsigned char *' to 'char *' 这是什么原因,怎么修改? 如果*.cpp改成:   A::A   {     *Str[]={"aaaa", "bbbbb","ccc","dddddd"};   } 则出现一个警告和三个错误: warning C4200: nonstandard extension used : zero-sized array in struct/union syntax error : ']' syntax error : missing ';' before '{' error C2143: syntax error : missing ';' before '}' 这又怎么改?能说明原因吗? 在类中怎么声明字符指针数组,在那里初始化数组?
发表于 2009-12-11 12:23:35 | 显示全部楼层
一个显然的错误就是你在.h文件中定义了unsigned char *Str[];
在A::A(){     *Str[]={"aaaa", "bbbbb","ccc","dddddd"};   } 这样赋值是完全错误的  
unsigned char  *Str[]={"aaaa", "bbbbb","ccc","dddddd"};  是字符串数组的初始化,要赋值,只能Str[0]="aaaaa",Str[1]=“bbbbb”.......;
其他的错误等会吃饭回来再说
发表于 2009-12-11 13:08:06 | 显示全部楼层
Str[0]是指针,怎么可以strcpy()??  Str[0]没有指向内存啊~~
发表于 2009-12-11 12:23:35 | 显示全部楼层
一个显然的错误就是你在.h文件中定义了unsigned char *Str[];
在A::A(){     *Str[]={"aaaa", "bbbbb","ccc","dddddd"};   } 这样赋值是完全错误的  
unsigned char  *Str[]={"aaaa", "bbbbb","ccc","dddddd"};  是字符串数组的初始化,要赋值,只能Str[0]="aaaaa",Str[1]=“bbbbb”.......;
其他的错误等会吃饭回来再说
发表于 2009-12-11 13:08:06 | 显示全部楼层
Str[0]是指针,怎么可以strcpy()??  Str[0]没有指向内存啊~~
发表于 2012-8-18 22:53:14 | 显示全部楼层
我觉饿数组名本身可以认为他是一个特殊的指针,也就是char *str[] = {"1,2,3,4"} 直接可以那数字名来复制,数组名就是数组的首地址,也就是个指针,可以做str = {"1,2,3,4"}这样来做。strcpy是拷贝指针参数2到参数1的首地址,楼主可以用*(str)【常量来定义】,然后操作指针*str或者*(str + 0)来获取你第一个字符串的地址来操作。
我是新人,不知道这样说对不对。
发表于 2012-8-26 14:53:19 | 显示全部楼层
今天仔细看了下楼主的问题,有以下几点请个问指点,看下我的观点是否正确:
1、楼主第一个错误就是数组的初始化赋值方式和数组的后期赋值方式的问题。数字在初始化赋值的时候看采用str = {1,2,3,4}大括号形式赋值。当然这种方式只能在申明的时候定义赋值。后期需要逐个赋值。就是针对数组下标逐个赋值。
2、我想,楼主你真真正创建对象的时候,楼主应该是直接创建了对象而不是指针对象,因为创建指针对象的时候,系统需要new内存空间出来。有了内存空间,才能给你存放数据,因为在类的头文件中的所有定义都是不分配内存地址的,也就是说楼主在h头文件中的 char*str[] 是没有实际意义。这个说法上面比较难解释清楚,就是内存的空间问题。
解决方法如下:
在cpp文件中:
str[0] = (unsigned char*) "aaaa";
        cout<<*str<<endl;
然后再main函数中:
CTest *test = new CTest;

或者说另外一种说法,定义数组除非在初始化的时候给出数据,那就可以不用定义数组的大小,但是由于类的头文件申明中,是不可以直接赋值的,所以楼主需要给出你所要创建数组的大小内容,让系统去按照你给出的大小内容去创建内存让你存放数据。由于楼主的作废是str[]没有大小数据,那种构造函数中,其实是初始化定义的类型数据。因为你的类型数据定义的时候都没有开内存空间,那你的类型数据等于没有定义。因为没有内存空间。
如果定义修正str【5】在头文件中。那就有了内存空间。就另当别论,在main函数中的定义就可以修改成 CTest test;这样系统就会在创建对象的同时调用构造函数里面的赋值语句。
注意:
赋值语句的方式楼主错了。必须逐个对准下标进行赋值。
以上说法本人已经通过程序编译正常执行。楼主可以尝试。
在概念的说法上,可能本人说的不是非常的清楚,比较含糊。本人对程序的表达能力可能不到位。希望谅解。
发表于 2012-8-26 14:58:47 | 显示全部楼层
补充部分:
“aaaa”是字符串,字符串的特点就是字符串本身就是一个指针,也就是一个指针的地址。
楼主在定义的时候定义的是unsigned char* str【】
但是实际上楼主给出的“aaaa”对系统来说默认的是string 或者说是signed char str[] = {'a','a','a','a'};或者换种说法signed char str[]= "aaaa",所以2边的类型不匹配,赋值基本的要点就是相同的类型,如果类型不同,需要通过转换,系统对于复杂饿赋值语句貌似会自动转换类型 比如 int + double = double 但是在简单的赋值的时候系统不会自动转换,需要楼主自己强制转换数据类型。
发表于 2013-4-25 22:40:54 | 显示全部楼层
不好意思才看到~
zhengfaqi这里理解错了~~
楼主定义的是字符串指针数组,数组中每一个元素都是一个字符串指针~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-30 19:44

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表