Qt中QString转char数组用于字符串全排列的问题咨询
转换原理与错误原因说明
1. 为什么char str[] = lettersString;始终报错
这是C++的语法规则限制:
- 只有用字符串字面量初始化char数组时,编译器才会自动计算长度并分配栈空间,
char str[] = "ABC"属于合法写法 - 当右侧是
std::string、char*这类非字面量表达式时,编译器无法在编译期确定数组长度,也不允许直接将指针赋值给数组,因此会直接抛出语法错误
2. 为什么用c_str()/直接调用toUtf8().data()会失败
核心问题是临时对象的生命周期悬空:
QString::toStdString()、QString::toUtf8()的返回值都是临时对象,在当前语句执行完成后就会被自动析构,其内部管理的字符串缓冲区也会被释放- 你直接从临时对象上拿到的
c_str()、data()指针会变成野指针,后续访问会出现乱码、崩溃等未定义行为
3. 现有方案可行的原因
你的写法刚好避开了上述两个问题:
- 你先把
letters.toUtf8()的返回值存到了局部变量arraylettersUTF8中,这个QByteArray对象的生命周期和整个槽函数一致,只要函数没执行完,它内部存储的UTF8编码缓冲区就不会被释放 QByteArray::data()返回的是指向内部缓冲区的可写char*指针,刚好匹配全排列函数permute需要修改输入字符串的要求- 你没有再用char数组初始化的写法,而是直接用
char* str = lettersString接收指针,避开了语法错误
其他可行替代方案
如果想基于std::string实现转换,也可以用以下写法,原理和现有方案一致:
std::string lettersString = letters.toStdString(); char* str = lettersString.data(); // C++11及以上可用,低版本可以写&lettersString[0] int n = str.size(); permute(str, 0, n-1);
内容的提问来源于stack exchange,提问作者Nasty Phoenix
相关产品推荐
相关产品推荐

