通过地址(指针)传递

时间:2019-01-31 18:22:12

标签: c pointers

void fun(char* name);

int main(){
    char* name = NULL;
    fun(name);
    printf("%s",name);
}

void fun(char* name){
    char input[SIZE];
    int length;

    printf("Please enter a name:\n");
    scanf("%s",input);
    length = strlen(input);
    name = (char*)malloc(sizeof(char)*length+1);
    if(name == NULL){
        exit(1);
    }
    strcpy(name, input);
}

我在想什么,我想指定字符串的指针,malloc的的不只是在功能范围,所以哪里是错?

2 个答案:

答案 0 :(得分:6)

您要传递一个指针的副本,更改该指针,而不是将指针发回。对name的任何修改仅存在于该函数中,除非您传入双指针或采用简单的方法来返回值。

修改该函数以返回可以使用的指针:

char* fun() {
    char input[SIZE];
    int length;

    printf("Please enter a name:\n");
    scanf("%s",input);
    length = strlen(input);

    char* name = malloc(sizeof(char)*length+1);

    if(name == NULL){
        exit(1);
    }
    strcpy(name, input);

    return name;
}

然后,当您调用它时,您可以直接进行分配:

int main(){
    char* name = fun();

    printf("%s",name);

    free(name);

    return 0;
}

有以传递一个指针没有好处。不管您传入的指针如何更改,都不会使用原始值,这意味着它没有用。

记住,你不需要预先声明你的功能,如果你声明main()最后,因为是传统。也不要忘记在该函数中returnint。编译时,使用-Wall来提醒常见错误。

答案 1 :(得分:2)

如果继续提供 name 作为输出参数,则需要将其作为输出参数,当前它只是局部的,在 fun

void fun(char** name);

int main(){
    char* name = NULL;
    fun(&name);
    printf("%s",name);
}

void fun(char** name){
    char input[SIZE];
    int length;

    printf("Please enter a name:\n");
    scanf("%s",input);
    length = strlen(input);
    *name = (char*)malloc(sizeof(char)*length+1);
    if(*name == NULL){
        exit(1);
    }
    strcpy(*name, input);
}

如您所见,我给出了变量 name 的地址,允许在 fun 中修改其值,因此类型是char*的指针char**

执行:

pi@raspberrypi:/tmp $ ./a.out
Please enter a name:
aze
aze

您错过免费提供名称

警告:如果输入大于 SIZE ,则假设SIZE不是常数,则您会从 input 中写入未定义的行为或者以后可以更改是更好的方法:

void fun(char** name){
    char input[SIZE];
    int length;
    char fmt[16];

    printf("Please enter a name:\n");

    sprintf(fmt, "%%%ds", SIZE);
    scanf(fmt, input);
    length = strlen(input);
    *name = (char*)malloc(sizeof(char)*length+1);
    if(*name == NULL){
        exit(1);
    }
    strcpy(*name, input);
}

如您所见,我制作了 scanf 的格式,例如,如果 SIZE 的值为10,则使用的格式将为“%10s”