从'const char *'到'unsigned char *'的转换无效

时间:2015-12-26 11:10:29

标签: c++ casting type-conversion

一个简单的C ++代码:

int main(){
unsigned char* t="123";
}
使用g ++编译时出现以下错误:

invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]

为什么?

4 个答案:

答案 0 :(得分:23)

在C ++中,字符串文字具有常量字符数组的类型。例如,字符串文字"123"的类型为const char[4]

在极少数例外的表达式中,数组被转换为指向其第一个元素的指针。

所以在这个宣言中

unsigned char* t="123";

初始值设定项的类型为const char *。没有从const char *unsigned char *

的隐式转换

你可以写

const unsigned char* t = reinterpret_cast<const unsigned char *>( "123" );

答案 1 :(得分:3)

另一种方法可以让你获得一个可修改的unsigned char数组,如你原先想要的那样:

#include <cstdlib>
#include <iostream>

using std::cout;
using std::endl;

int main()
{
    unsigned char ta[] = "123";
    unsigned char* t = ta;

    cout << t << endl;  // Or ta.

    return EXIT_SUCCESS;
}

如果您愿意,可以在两个声明中添加const,以便在没有明确演员的情况下获取const unsigned char

答案 2 :(得分:1)

使用自定义宏时,从一种类型到另一种类型的转换很容易。所以这里有一组可以在任何平台上使用的宏(Windows,Linux,Solaris,AIX等......)

#define M_ToCharPtr(p)        reinterpret_cast<char*>(p)                   // Cast to char*
#define M_ToWCharPtr(p)       reinterpret_cast<wchar_t*>(p)                // Cast to wchar_t*
#define M_ToConstCharPtr(p)   reinterpret_cast<const char*>(p)             // Cast to const char*
#define M_ToConstWCharPtr(p)  reinterpret_cast<const wchar_t*>(p)          // Cast to const wchar_t*
#define M_ToUCharPtr(p)       reinterpret_cast<unsigned char*>(p)          // Cast to unsigned char*
#define M_ToConstUCharPtr(p)  reinterpret_cast<const unsigned char*>(p)    // Cast to const unsigned char*
#define M_ToUCharPtr(n)       reinterpret_cast<unsigned char*>(n)          // Cast to unsigned char*
#define M_ToVoidPtr(p)        reinterpret_cast<void*>(p)                   // Cast to void*
#define M_ToConstVoidPtr(p)   reinterpret_cast<const void*>(p)             // Cast to const void*
#define M_ToIntPtr(n)         reinterpret_cast<int*>(n)                    // Cast to int*
#define M_ToConstIntPtr(p)    reinterpret_cast<const int*>(p)              // Cast to const int*
#define M_ToDoublePtr(n)      reinterpret_cast<double*>(n)                 // Cast to double*
#define M_ToConstDoublePtr(n) reinterpret_cast<const double*>(n)           // Cast to const double*
#define M_ToBoolPtr(n)        reinterpret_cast<bool*>(n)                   // Cast to bool*
#define M_ToConstBoolPtr(n)   reinterpret_cast<const bool*>(n)             // Cast to const bool*

// General Cast
#define M_To(T, p)            reinterpret_cast<T>(p)                       // Cast to T

在你的情况下

const unsigned char* t = reinterpret_cast<const unsigned char *>("UCHAR TO CONST UCHAR");

相当于

const unsigned char* t = M_ToConstUCharPtr("UCHAR TO CONST UCHAR");

答案 3 :(得分:0)

只需使用

  1. 在声明

  2. 期间使用char *代替unsigned char *
  3. char t [MAX_SIZE] =&#34; 123&#34 ;; //应该在之前定义MAX_SIZE

  4. 时间测试 strcpy() strncpy 函数