2016-04-08 8 views
0

Ich programmiere in ansi C in einer Linux-Umgebung, ich benutze GCC-Compiler. Ich habe den folgenden CodeC-Programmierung, Segmentierung Fehler beim Zuweisen von int-Member in struct zu Integer

#define USER_IN_LEN 15 
#define EXTRA_SPACES 2 
#define DELIMS " ,\n" 

//define the sruct 
typedef struct position 
{ 
    int x; 
    int y; 
} Position; 


char choice[USER_IN_LEN + EXTRA_SPACES]; 
//define pointers for strtok and strtol 
char *tok; 
char *end; 

//create pointer o type Position 
Position *position; 
//get user input with fgets 
fgets(choice, USER_IN_LEN, stdin); 

//tokenize 
tok = strtok(choice, DELIMS); 
tok = strtok(NULL, DELIMS); 
position->x = (int)strtol(tok, &end, 0); //error, segmentation fault 
tok = strtok(NULL, DELIMS); 
position->y = (int)strtol(tok, &end, 0);//error, segmentation fault 

Grundsätzlich ist das Programm wird eine Benutzereingabe für einige Werte und speichern sie in der Lage, Struktur, habe ich einige Online-Forschung tat und fand heraus, dass ich diese position->y = int verwenden können, aber warum nicht funktioniert es hier mit strtol? Ich lief den Debugger und es half nicht viel

+2

'Position * position' ist ein uninitialised Zeiger. Sie müssen darauf hinweisen, irgendwo gültig, möglicherweise durch "malloc" Speicher, wenn Sie es dereferenzieren möchten. –

Antwort

1

position ist ein Zeiger auf eine Struktur. Sie setzen nie position auf einen beliebigen Wert, also könnte es überall zeigen! - Sie rufen also undefiniertes Verhalten auf.

Quick Fix:

Position instance; 
position = &instance; 
+0

Das funktioniert dank! Wie würde ich aber die x- und y-Werte ausdrucken? Ich komme aus einem Java-Hintergrund und nicht viel mit Zeigern –

+0

Normaler Weg in C zu drucken wäre 'printf ("% d,% d \ n ", Position-> x, Position-> y);' – John3136

+0

Prost Kumpel, alles hat geklappt :) –