2017-02-19 2 views
0

Ich brauche deine Hilfe! Warum in C-Strukturen von Daten, die in Zeichenfolgen speichert funktioniert nur 1 Art der Deklaration: char *name; funktioniert, aber char []name; funktioniert nicht.Char Zeichenfolge in einer Struktur C

Aber wenn zu versuchen, eine Zeichenkette innerhalb des Codes zu deklarieren (ohne Verwendung von struct), alles funktioniert. Code-Beispiel, das veranschaulicht, wann wann Char-Array zu deklarieren ist, funktionieren beide Deklarationstypen.

#include "funct.h" 
#include "stdio.h" 

//structure employee name and surname only works when using char* pointers 

struct employee { 
    char *name; 
    char *surname; 
}; 

int main() { 
    struct employee worker; 
    worker.name = "Robert"; 
    worker.surname = "Woz"; 

    printf("\n"); 
    printf("%s", worker.name); 
    printf("\n"); 
    printf("%s", worker.surname); 
    printf("\n"); 

    char name[] = "Robert"; //declaration of array with using [] postfix 

    for (int i = 0; i < 7; i++) { 
     printf("%c", name[i]); 
    } 

    printf("\n"); 

    char *surname = "Woz"; //declaration of array wit using char* pointer 

    for (int i = 0; i < 4; i++) { 
     printf("%c", surname[i]); 
    } 

    printf("\n"); 

    return (0); 
} 

Programmausgabe:

Robert 
Woz 
Robert 
Woz 
+0

C oder C++? Wähle ein. –

+0

'char * Nachname' deklariert kein Array; es deklariert einen Zeiger. – melpomene

+0

'char * Nachname =" Woz ";' erstellt ein String-Literal der statischen Lebensdauer und weist 'Nachname 'zu, um darauf zu zeigen. 'Char-Name [] =" Robert ";' erstellt ein Character-Array mit Gültigkeitsdauer, ein Array ist nicht dasselbe wie ein Pointer_, und so hat ein Array einige zusätzliche Informationen, dh seine Größe, wo ein Zeiger nicht weiß, wie viel Erinnerung, auf die es zeigt. – George

Antwort

2

Zunächst einmal gehören die Standard-Bibliothek Header verwenden <header.h> statt "header.h". Bei Verwendung der Anführungszeichen versucht der Compiler, den Header im Dateiverzeichnis zu finden. Bei Verwendung von <> sucht der Compiler nach dem Header in Ihrem Include-Verzeichnis.

Zweitens akzeptiert die Deklaration mit Klammern nur char name[];, nicht char []name;. Wenn Sie dies jedoch in einer Struktur deklarieren, müssen Sie die Größe angeben, z. B. char name[30];. Sie können nur ohne eine Größe deklarieren, wenn Sie eine einzelne Variable deklarieren und sie mit einem String-Literal initialisieren, damit der Compiler die Größe aus dem String-Literal ableitet. Beispiel: char name[] = "Robert";.

Drittens ist die Differenz char* name deklariert von char name[30] erklärt, ist, dass in der ersten Weise einen Zeiger auf eine Folge von Zeichen in dem Speicher erklären, während in der zweiten Art und Weise erklären Sie eine feste Größe Array. Beachten Sie, dass das Zuordnen eines Array fester Größe zu einem kleineren String-Literal (oder größer) nach seiner Initialisierung zu einem Fehler führen kann, während das Zuweisen eines char Zeigers es Ihnen ermöglicht, es an Zeichenfolgenliterale beliebiger Größe zu übergeben.

+0

Aber die Größe des Arrays, das auf diese Weise 'char * name' deklariert, wird statisch sein, oder ich kann es mit' realloc(); 'Funktion redeclare? –

+0

'char * name' definiert überhaupt kein Array, sondern nur einen Zeiger, der *** auf ein' char' zeigen kann, wobei *** *** das erste Element eines Arrays sein könnte, *** wenn du es darauf hingewiesen hast. – alk

+0

Um "realloc" für irgendwas zu verwenden, müssen Sie zuerst 'malloc' oder' calloc' verwenden und ihm den Rückgabewert 'malloc' zuweisen. Und nachdem Sie die Variable verwendet haben, die Sie 'malloc' zugewiesen haben, müssen Sie' free' verwenden. Wenn Sie die dynamische Speicherzuweisung mit der 'malloc'-Familie verwenden möchten, verwenden Sie ein' char * '. Wenn Sie die Variable String-Literalen unterschiedlicher Größe zuweisen möchten, sollten Sie auch 'char *' verwenden. –

0

Wenn Sie char name[] in einer Struktur verwenden, kennt Ihr Compiler die Größe der Registerkarte char nicht. Deshalb müssen Sie einen Zeiger in Ihrem Strukturtyp verwenden, oder Sie könnten

char name[MAX_SIZE]; in Ihrem Strukturtyp verwenden.

Aber ich empfehlen Zeiger :)

+0

Aber Zeiger ist nur eine Variable, die gespeicherte Speicheradresse, vs arser.surname gespeicherten Array, die eine gewisse Anzahl von Zeichenelementen haben, wann ist reservierter Speicher für Zeichenfolge? In diesem Moment: 'worker.surname =" Woz ";'? –

+0

Array-Name ist ein Zeiger, die Adresse des ersten Array-Elements speichern, oder nein? –

0

Nach Ihrer Frage verwenden.

  1. Header-Datei zitiert. < > statt " "
  2. Ich glaube nicht, dass C das Array wie Java deklarieren lässt. char name[] = " "; statt char []name=" ";

    *name ist einfach ein Zeiger.

Verwandte Themen