2016-05-16 12 views
2

Ich habe diesen CodeFehler mit Zeiger auf ein Array

#include <stdio.h> 

int main(void) 
{ 
    char cad[] = "abc"; 

    char (*ptr)[1]; 

    ptr[0] = cad; 

    return 0; 
} 

Wenn kompiliert wirft mir dieser Fehler:

error #2168: Operands of '=' have incompatible types 'char [1]' and 'char *'. 

Warum dieser Fehler auftritt? Hier

+0

ptr [0] bedeutet ein einzelnes Zeichen ... cad ein Zeiger ist .. –

+2

Könnten Sie klären, welcher Teil der Fehler, den Sie nicht verstehen? – juanchopanza

+0

Was versuchst du zu tun? Sie sollten ptr [0] = cad [0] –

Antwort

3

Why this error occurs?

Expression ptr[0] hat char[1] geben, weil ptr lika Zeiger auf Array von char[1] Typ deklariert ist

char (*ptr)[1]; 

Expression cadchar * Typ hat und ist gleich der Adresse des ersten Zeichens des Arrays cad.

Vom C Standard (6.3.2.1 Lvalues, Arrays und Funktion Bezeich)

3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

So ist in der linken Seite der Zuweisungsanweisung

ptr[0] = cad; 

ein Array vom Typ gibt es char[1] . Auf der rechten Seite der Zuordnung befindet sich ein Zeiger vom Typ char *. Diese Typen sind inkompatibel und Arrays haben keinen Zuweisungsoperator.

Es scheint, dass Sie die folgende

#include <stdio.h> 

int main(void) 
{ 
    char cad[] = "abc"; 

    char * ptr[1]; 

    ptr[0] = cad; 

    // puts(ptr[0]); 

    return 0; 
} 
+0

@AniMenon Versuchen Sie, die kommentierte Anweisung auskommentieren. –

1

Why this error occurs (sic)?

char cad[] = "abc"; 

, cad ist ein char[4] (mit Zeichen 'a', 'b', 'c', '\0'.)

char (*ptr)[1]; 

und hier ist ptr ein Zeiger auf char[1]. So ist ein char[1].

In dem Zuweisungsausdruck

ptr[0] = cad; 

cad zerfällt zu char*. Sie enden also mit inkompatiblen Operanden, nämlich char[1] auf der LHS und char* auf der RHS, genau wie die Compiler-Fehlermeldung Ihnen sagt.

Zwei weitere Dinge erwähnenswert:

  • Arrays sind nicht übertragbar, so dass es kein Zuweisungsausdruck, für die ptr[0] = ???; gültig ist, die Art der ptr gegeben.

  • In Ihrem Code gibt es keine Pointer-Arrays.

0

Die Fehlermeldung vom Compiler ist sehr klar.

Typ ptr ist char (*)[1].
Typ ist char [1].
cad zerfällt zu einem Zeiger, wenn in ptr[0] = cad verwendet. Daher ist der Typ der RHS char*. Sie können char* keinem char [1] zuweisen. Auch

,

ptr[0] = ...; 

führt zu undefinierten Verhalten, da der Speicher nicht für ptr zugeordnet.

Es ist unklar, was Sie zu erreichen versuchen. Sie können so etwas wie tun:

char (*ptr)[1] = malloc(sizeof(*ptr)); 
ptr[0][0] = cad[0]; 

Dies wird das erste Zeichen von cad in ptr[0][0] setzen. ist jedoch keine nullterminierte Zeichenfolge. Daher können Sie es nicht wie eine Zeichenfolge verwenden.

1

Ich denke, das ist das, was Sie tun möchten:

#include <stdio.h> 

int main(void) 
{ 
    char cad[] = "abc"; 
    int n = sizeof (cad)/sizeof (cad[0]); 
    char (*ptr)[n]; 
    ptr = &cad; 
    printf("%s",*ptr); 
    return 0; 
} 

Ausgang:

abc 

Das Problem mit dem, was Sie taten, war:

char cad[] = "abc"; 
char (*ptr)[1]; 
ptr[0] = cad; 

char-Array cad hat "abc", Zeigerarray vom Typ char und dann hast du versucht zuzuordnen ein einzelner Index des Zeigerarrays (welcher ein char ist) mit einem char[] (das ist cad), was zu einer Typabweichung führt.

Verwandte Themen