2016-03-19 13 views
1

Ich habe diesen Code Ausprobieren Zeiger mit ganzen Zahlen und es gibt eine Warnung der Initialisierung macht Zeiger aus Ganzzahl ohne eine Besetzung während der Kompilierung. Es scheint auch, dass nach der Kompilierung die .exe-Datei nicht ordnungsgemäß ausgeführt wird. Bitte helfen Sie!Warnung: Initialisierung macht Zeiger von Ganzzahl ohne Besetzung (Integer-Zeiger)

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

int 
main(int argc, char* argv[]) { 
    int num1=10, *num2=1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 
    *num2 = num1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 

    return 0; 
} 

Error message

+0

Danke für die Hilfe alle! : D – Rio

Antwort

5

Sie konvertiert eine ganze Zahl 1 auf einen Zeiger in der Implementierung definiert, und der umgewandelte Zeiger hat zu wenig Chance ein gültiger Zeiger zu sein. Als Ergebnis führt die Dereferenzierung des Zeigers und das Lesen oder Schreiben eines Werts zu einer großen Wahrscheinlichkeit zu einem Segmentierungsfehler.

Erstellen Sie ein Objekt, auf das der Zeiger zeigen soll, und zeigen Sie mit dem Zeiger auf das Objekt. Verwenden Sie danach den Zeiger, um Werte zu lesen oder zu schreiben, auf die er zeigt.

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

int 
main(int argc, char* argv[]) { 
    int obj = 0; /* do initialize before using the value */ 
    int num1=10, *num2=&obj; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 
    *num2 = num1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 

    return 0; 
} 
3

Dieser:

int num1=10, *num2=1; 

entspricht:

int num1 = 10; 
int *num2 = 1; 

Die zweite Variable ist ein Zeiger auf int und wenn man einen Wert zuweisen, oder es initialisieren, erhalten Sie einen zuweisen Adresse. Sie erstellen keinen Zeiger auf eine Ganzzahl mit dem Wert 1.

Das bedeutet die Warnung: Sie konvertieren eine Ganzzahl in einen Zeiger, der normalerweise ein Fehler ist.

Wenn Sie einen Zeiger auf einen int möchten, müssen Sie beide erstellen:

int num2 = 1; 
int *pnum2 = &num2;  // pointer to num2, *num2 == 1 
0

num2 ein Zeiger ist. Also soll es eine Adresse speichern. Sie können niemals einen INTEGER VALUE, wie zB 1, darin speichern. Ein Zeiger soll eine Adresse speichern. Es kann ADDRESS einer Variablen speichern. Also habe ich Ihren num2 mit der Adresse von num1 integer Variable initialisiert und nun funktioniert Ihr Code. Wenn Sie versuchen, Ihren num2 zu initialisieren, um den Wert "garbage" zu entfernen, können Sie NULL in num2 speichern. Aber stellen Sie sicher, dass Sie keinen Null-Zeiger dereferenzieren (wie die Anweisung printf (* num2)), da der Dereferenzierung eines NULL-Zeigers ein schwerwiegender Laufzeitfehler ist, Segmentierungsfehler.

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

    int main(int argc, char* argv[]) { 
    int num1=10, num2=&num1; //this is what i have changed in your code 
    printf("num1=%d \t num2=%d \n", num1, *num2); 
    *num2 = num1; 
    printf("num1=%d \t num2=%d \n", num1, *num2); 

    return 0; 
} 
+0

zweite Sache? Hab nicht verstanden, was du zu sagen versuchst. Können Sie ein wenig –

+0

oh ja! okay, ich habe es aktualisiert. : D –

Verwandte Themen