2016-04-19 11 views
-4

Ich habe den folgenden Code:Zeiger und sein Wert gleich in C

typdef struct fractal 
{ 
    int *tab; 
}*frac; 

frac new = (frac) malloc(1000*sizeof(struct frac)); 
new->tab = (int *) calloc(100,sizeof(int)); 

Als ich tab und *tab es gibt mir die gleiche Antwort ...

printf("new->tab = %d\n *(new->tab) = %d\n", tab->new, *(tab->new)); 

Auf meinem drucken möchten Terminal Ich habe:

new->tab = 1946160960 
*(new->tab) = 1946160960 

Wie ist das möglich?

Vielen Dank für Ihre Antworten und sorry für mein Englisch :)

+4

Sie die Verwendung von vermeiden sollte ' neue Kennung. – Michi

+0

Sie sollten den Rückgabewert von 'malloc' nicht umwandeln: [siehe hier] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – trentcl

+0

Auch die 'printf' Zeile scheint nicht mit dem Rest des Codes zu gehen. Bitte poste ein Beispiel, dass potentielle Helfer kompilieren können. – trentcl

Antwort

1

Wie viele Dinge haben sich bereits in den Kommentaren erwähnt, ich werde versuchen, die wichtigen Punkte zusammenzufassen.

  • nicht nennen eine Variable new
  • es typedeftypdef
  • das -Wall Argument nicht ist verwenden, wenn sie mit gcc kompilieren Compiler-Warnungen zu sehen (dh gcc foo.c -Wall)
  • Sie nicht den zurück void-Zeiger werfen sollte von malloc
  • 'struct frac' existiert nicht, 'frac' ist eigentlich eine struct, da Sie es so definiert haben, mit typedef
  • , wenn Sie die Variable x für die Verwendung der Zeiger y zugreifen möchten, schreiben y-> x und nicht x-> y (structPointer-> varName)

ich Ihr Code die Art und Weise eingestellt Ich dachte, Sie wollten es schreiben. Bitte geben Sie weitere Informationen darüber, was Sie mit dem Code erreichen wollen, so können wir Ihnen noch besser helfen :)

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


typedef struct fractal { 
    int *tab; 
}* frac; 


int main(void) 
{ 
    frac n = malloc(1000 * sizeof(frac)); // allocate space for 1000 struct fractal 
    n->tab = calloc(100, sizeof(int)); // allocate space for 100 int 
    (n->tab)[0] = 42; // set the int value of the first of the 100 ints to 42 
    printf("n->tab = %p\n", (void *) n->tab); // n->tab is an int pointer pointing to the first element of the 100 ints 
    printf("*(n->tab) = %d\n", *(n->tab)); // *(n->tab) is the value of the first element of the 100 ints 
    return(0); 
} 

Die Terminal-Ausgabe wird wie folgt:

n->tab = 8656712 // this will have a different value each time you run the code 
*(n->tab) = 42 
+1

Gute Punkte, jedoch würde ich hinzufügen, dass beim Drucken eines Zeigers mit% p immer das Argument auf '(void *)' geworfen werden sollte. Obwohl es einer der wenigen Orte in C ist, wo eine Besetzung tatsächlich benötigt wird, ist es einer der am häufigsten übersehenen. – trentcl

+1

@trentcl Danke, wusste das noch nicht. Ich habe die Antwort bearbeitet. – jboockmann