字符串指针在函数之间不起作用

时间:2015-02-24 17:11:48

标签: c function pointers arguments

我试图通过在函数之间传递指向字符串的指针,在每种情况下为错误变量分配不同的错误消息,但由于任何原因,效果不佳。

以下是代码:

//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;
}

输出:

user@console:~/$ ./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

2 个答案:

答案 0 :(得分:0)

您需要传递指向函数输出参数的指针。由于输出参数为char*,因此指向它的指针为char**

要修复,请将相应的行更改为:

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

答案 1 :(得分: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;
}

另外,你应该考虑在声明之后不要留下没有值的指针,就像你在main()中使用char *错误一样。

问题是,当你有一个未初始化的指针,然后你忘了给它一个值或类似的东西时,它可以指向应用程序内存中的任何位置(或超出它)。虚拟内存可以保护您免于读取和写入其他应用程序内存(一般来说),但您可能会遇到指针恰好指向应用程序内部某些数据的情况。然后,如果您使用此指针进行写入或读取,您将会产生不可预测的结果,从显示错误数据到破坏数据或崩溃应用程序,这显然是您不想要的。