2015-02-24 160 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);