web-dev-qa-db-de.com

Ungültige Konvertierung von "const char *" in "unsigned char *"

Ein einfacher C++ - Code:

int main(){
unsigned char* t="123";
}

beim Kompilieren mit g ++ ergibt sich folgender Fehler:

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

Warum?

12
anupamD

In C++ haben String-Literale Typen von konstanten Zeichenarrays. Beispielsweise hat das String-Literal "123" den Typ const char[4].

In Ausdrücken mit seltenen Ausnahmen werden Arrays in Zeiger auf ihre ersten Elemente umgewandelt.

Also in dieser Erklärung

unsigned char* t="123";

der Initialisierer hat den Typ const char *. Es erfolgt keine implizite Konvertierung von const char * in unsigned char *

Du könntest schreiben

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

Ein anderer Ansatz, mit dem Sie ein änderbares unsigned char-Array erhalten, das Sie ursprünglich wollten, ist:

#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;
}

Sie können const zu beiden Deklarationen hinzufügen, wenn Sie möchten, dass const unsigned char ohne explizite Umwandlung erhalten wird.

3
Davislor

Konvertierungen von einem Typ zu einem anderen Typ sind einfach, wenn Sie selbst definierte Makros verwenden. Hier ist eine Reihe von Makros, die Sie auf jeder Plattform verwenden können (Windows, Linux, Solaris, AIX usw.)

#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

In Ihrem Fall

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

ist äquivalent zu 

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

Einfach verwenden 

  1. nur char * anstelle von unsigniertem char * während der Deklaration

  2. char t [MAX_SIZE] = "123"; // MAX_SIZE sollte früher definiert werden

  3. zeit getestet strcpy () und strncpy Funktionen

0
malang