• 7577阅读
  • 3回复

一个QStringList转char**类型的问题 [复制链接]

上一主题 下一主题
离线tian0611
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-08

相关代码如下:

char  **t;
QStringList list;
list << "123456" << “kkkkkkkkk” << "6666" << "ooooooo";

t = (char **)malloc(  ( ( list.size()+1)*sizeof(char *)));

int i;
for( i = 0; i < list.size(); ++i)
   t[ i] = list[ i].toAsscii().date();
t[ i] = 0;

while( *t)
   printf( "%s\n", *( t++));

输出的结果为:
ooooooo
ooooooo
6666
ooooooo

请问问题出在哪里呢,反正就是转变不出来,在for循环中逐个输出是对的,但一出for循环就不行了
离线wader
只看该作者 1楼 发表于: 2009-06-09
问题主要出在这句:
  1. t[i] = list[ i].toAsscii().date();

list_i.toAscii() 返回了一个临时的QByteArray对象(取名为temp吧),然后调用了temp的成员函数data()返回了一个指向Ascii字符串的指针char*,并将其赋值给了t_i,但是,它的内存空间来自temp对象,而这个temp对象在data()函数调用结束后就析构了,不存在了。
一句话,t_i指向的内存是一块曾经被用来存放数据的区域,所以之后的调用都是错误了,而for循环中的正确结果也是巧合。

要得到正确结果,就得确保在使用之前,那个QByteArray的临时对象是存在的,下面是一个可行的方案,但不完美,感觉挺麻烦的

  1.     char  **t;
  2.     QStringList list;
  3.     list << "123456" << "kkkkkkkkk" << "6666" << "ooooooo";
  4.     t = (char **)malloc(((list.size()+1)*sizeof(char *)));
  5.     QByteArray** ba = new QByteArray*[list.size()];
  6.     for(int i = 0; i < list.size(); ++i) {
  7.         ba[i] = new QByteArray(list[i].toAscii());
  8.         t[i] = ba[i]->data();
  9.         printf("%s\n", t[i]);
  10.     }
  11.     t[i] = 0;
  12.     while(*t)
  13.         printf( "%s\n", *( t++));
  14.     for(int i = 0; i < list.size(); ++i)
  15.         delete ba[i];
  16.     delete []ba;
[ 此帖被wader在2009-06-09 02:07重新编辑 ]
离线duduqq

只看该作者 2楼 发表于: 2009-06-09
楼上的高手,这都能看得出来,看来C很牛喔
离线foxyz

只看该作者 3楼 发表于: 2009-06-09
malloc(  ( ( list.size()+1)*sizeof(char *)));
这就不对了

sizeof(char *) == 4

2.你循环中把一个指针付值给你都已经malloc出来的指针,又不对。
请这样写:
#define MaxSize 10
t = (char **)malloc((list.size()+1)*MaxSize );

for( i = 0; i < list.size(); ++i)
{
    memcpy(t[ i], list[ i].toAscii().data(), MaxSize);
}
快速回复
限100 字节
 
上一个 下一个