2017-01-03 3 views
1

ich einen Code wie folgt in C:Struktur Zeiger in Strukturdefinition

typedef struct _a1{ 
    int d1; 
} a1, *pa1; 

ich einen anderen Zeiger erstellen und verwenden Sie es mögen:

a1 *pa2 = NULL; 
pa2 = (a1*)malloc(sizeof(a1)); 

Der Versuch, das gleiche für "PA1" schlägt fehl. Wie verwende ich den Zeiger "pa1"?

+0

Für einen Anfang gibt es ein Problem mit der Leertaste ?. Nummer 2 du musst malloc nicht gießen, da es schlecht ist. –

+0

@EdHeal auf einigen Compilern mit dem non-permissive Flag, das Sie ohne eine Besetzung nicht kompilieren können. – kabanus

+2

Siehe [Ist es eine gute Idee zu "typedef" Zeigern?] (Https://stackoverflow.com/questions/750178/is-it-a-good-idea-to-typedef-pointer) - kurze Antwort "Nein" , aber das machst du, ob du es erkannt hast oder nicht. –

Antwort

3

Falls es nicht klar ist, pa1 ist kein Zeiger auf eine a1 Struktur. Was Sie mit dem Typdef tun, ist nur zwei Typen zu definieren - ein Typ, der Zeiger auf Ihre Struktur ist (p1 = a1 *), und einer der Struktur selbst (a1). Bei mir funktioniert dies ohne Probleme:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct _a1{ 
    int d1; 
} a1, *p1; 

int main() { 
    p1 p2 = NULL; 
    p2 = (p1)malloc(sizeof(a1)); 
    printf("%p\n",p2); 
    return 0; 
} 

Und ich schlage vor, das Lesen Is it a good idea to typedef pointers? - Ich stimme voll und ganz.

+0

Der OP-Code ist C, nicht C++. – dbush

+0

@dbush Sorry, ich werde bearbeiten, obwohl nicht sicher, ob es wichtig ist. – kabanus

+1

Es ist wichtig. Menschen zeigen C++ - Code für eine C-Frage verwirrt Menschen, die C lernen und einen echten C-Compiler verwenden. Tatsächlich verwirrt es auch diejenigen, die C lernen und einen C++ - Compiler verwenden. C und C++ sind zwei sehr unterschiedliche Sprachen. Sie sollten im Prinzip niemals C++ - Code in eine Antwort auf eine C-Frage auf SO schreiben. –

Verwandte Themen