繁体   English   中英

通过地址(指针)传递

[英]Pass by address (pointer)

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的范围,所以错误在哪里?

您正在传递一个指针的副本,更改该指针,而不是将指针发回。 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() ,则无需预先声明函数。 不要忘记在该函数中也return一个int 编译时,请使用-Wall来警告常见错误。

如果继续将其作为参数,则需要将其命名为输出参数,当前它仅是本地的,在乐趣之外看不到任何更改

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

正如你看到我给变量允许修改它的乐趣值的地址,所以该类型是一个的指针char*是一个char**

执行:

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

你想念免费的名字

警告 :如果输入大于SIZE,您将有一个不确定的行为写出输入 ,假设SIZE不是常数或以后可以更改,则最好执行以下操作:

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”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM