从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 '}'
这又怎么改?能说明原因吗?在类中怎么声明字符指针数组,在那里初始化数组?

解决方案 »

  1.   

    既然只是一个指针
    那你赋值的时候就的new出来啊
    初始化可以用memset
      

  2.   

    unsigned char *Str[]; 
    ============
    在类声明中将上面的改成char *Str[];即可,初始化还是在构造函数中实现
      

  3.   

    unsigned char *Str[]; 
    只是说定义的是一个数组指针,但是这个数组有多少个元素没有定义。strcpy(Str[0], "aaaa"); 
    你可以把str[0]按char*转一下。
      

  4.   

    定义一个类保存单个字符串, 另一个类将前面的这个类作为成员变量就OK了,简单写了下
    //CSingleString类的.h文件
    class CSingleString
    {
    public:
        //默认构造
        CSingleString();
        //传入单个字符串及字符串长度
        BOOL Init(unsigned char *sStr, int len);
        ~CSingleString();
    private:
        unsigned char *m_SingleString;
        int m_length;
    };
    CSingleString::CSingleString()
    {
       m_SingleString = NULL;
    }
    BOOL CSingleString::Init(unsigned char *sStr, int len)
    {
        if(len > 0)
        {
            m_length = len;
            m_SingleString = new unsigned char[len];
            memcpy(m_SingleString, sStr, len);
            return true;
        }
        return false;
    }
    //CSingleString的.cpp文件
    CSingleString::~CSingleString()
    {
        if(m_SingleString != NULL)
        {
            delete [] m_SingleString;
            m_SingleString = NULL;
        }
    }
    class A 
      {
        A();
        ~A(); 
        private: 
        CSingleStringr *m_Str; 
        ....... 
      };
    A::A 
      { 
        m_Str = new CSingleStringr[4];
        m_Str[0].Init("aaaa", strlen("aaaa"));
        m_Str[1].... 
      }
    A::~A()
    {
        if(m_Str != NULL)
        {
            delete [] m_Str;
            m_Str = NULL;
        }
    }