2015-02-24 207 views
0

我想傳遞一個指向字符串函數之間,但出於某種原因無法正常工作分配不同的錯誤消息,在每種情況下的錯誤變量之間不工作。字符串指針功能

下面是代碼:

//This function takes a pointer to a char. 
int lee(Fecha *f, char *error){ 
    int checking; 
    printf("Introduzca una fecha compuesta por día, mes, y año\n"); 
    checking = scanf("%i %i %i", &f->day, &f->month, &f->year); 
    printf("%d\n", checking); 
    switch (checking){ 
     case 0: 
      //The message is assigned to the space where error points to. 
      *error = "Formato de fecha incorrecto. El día debe ser un entero."; 
     break; 
     case 1: 
      *error = "Formato de fecha incorrecto. El mes debe ser un entero."; 
     break; 
     case 2: 
      *error = "Formato de fecha incorrecto. El año debe ser un entero."; 
     break; 
    } 
    return (checking == 3); 
} 

int main(){ 
    Fecha f; 
    //error is declared like a pointer 
    char * error; 
    int ret; 
    //The pointer is passed to the function as argument. 
    ret = lee(&f, error); 
    printf("%s", error); 
    return 0; 
} 

和輸出:

[email protected]:~/$ ./Sesion1 
Introduzca una fecha compuesta por día, mes, y año (o 0 0 0 para terminar el programa) 
23 dfgadkfhgsñdgh 5 
1 
Segmentation fault 
+3

看看'* error',想想這意味着什麼。你分配給它什麼,它如何工作記憶明智? – 2015-02-24 17:14:47

+0

是啊..找malloc的錯誤....未能.... – 2015-02-24 17:14:51

回答

0

既然你想輸出字符串,你需要傳遞指針到你的char *,所以你需要傳遞錯誤爲char * *。

所以功能將

int lee(Fecha *f, char **error){ 
    int checking; 
    printf("Introduzca una fecha compuesta por día, mes, y año\n"); 
    checking = scanf("%i %i %i", &f->day, &f->month, &f->year); 
    printf("%d\n", checking); 
    switch (checking){ 
     case 0: 
      //The message is assigned to the space where error points to. 
      *error = "Formato de fecha incorrecto. El día debe ser un entero."; 
     break; 
     case 1: 
      *error = "Formato de fecha incorrecto. El mes debe ser un entero."; 
     break; 
     case 2: 
      *error = "Formato de fecha incorrecto. El año debe ser un entero."; 
     break; 
    } 
    return (checking == 3); 
} 

int main(){ 
    Fecha f; 
    //error is declared like a pointer 
    char * error; 
    int ret; 
    //The pointer is passed to the function as argument. 
    ret = lee(&f, &error); 
    printf("%s", error); 
    return 0; 
} 

此外,像你這樣的char *錯誤主要做了你應該考慮沒有價值不會離開指針聲明後()。

的問題是,當你有未初始化的指針,然後你忘了給它一個值或類似這樣的東西,它可以在你的應用程序內存內的任何位置點(或超越它)。虛擬內存可以保護您免於讀取和寫入其他應用程序內存(一般來說),但您可能會遇到指針碰巧指向應用程序內某些數據的情況。如果你再使用該指針寫入或讀取,你將有不可預知的後果,輕則只是顯示錯誤數據破壞數據或崩潰的應用程序,你顯然不希望。

+0

感謝您的答覆(感謝所有在事實)。也許那個不可預知的結果的情況可能會解決初始化錯誤指針爲NULL? 'char * error = NULL;' – Atoj 2015-02-24 17:47:04

+0

沒問題,每個人都需要從某個地方開始。在繼續前進之前,確保你用指針和內存理解所有這些東西。 – Spo1ler 2015-02-24 17:48:06

0

您需要將指針傳遞給你的函數輸出參數。由於您的輸出參數爲char*,指針,它是char**

要修復,改變相應行:

int lee(Fecha *f, char **error); 
// ... 
ret = lee(&f, &error);