Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 传递地址(指针)_C_Pointers - Fatal编程技术网

C 传递地址(指针)

C 传递地址(指针),c,pointers,C,Pointers,我遗漏了什么,我正在尝试将字符串分配给指针,malloc的作用域不只是在函数中,那么错误在哪里呢?如果继续将名称作为参数提供,则需要将其作为输出参数,目前它只是局部的,并且在外部看不到任何更改 正如您所看到的,我给出了变量名的地址,允许在fun中修改其值,因此类型是char*作为char** 执行: void fun(char** name); int main(){ char* name = NULL; fun(&name); printf("%s",name

我遗漏了什么,我正在尝试将字符串分配给指针,malloc的作用域不只是在函数中,那么错误在哪里呢?

如果继续将名称作为参数提供,则需要将其作为输出参数,目前它只是局部的,并且在外部看不到任何更改

正如您所看到的,我给出了变量名的地址,允许在fun中修改其值,因此类型是
char*
作为
char**

执行:

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);
}
你错过了自由的名字

警告:如果输入大于大小,您将有一个未定义的行为从输入中写入,假设大小不是常数或以后可以更改,最好这样做:

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

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

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

重新编写函数以返回可以使用的指针:

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);
}
然后,当您调用它时,您可以执行直接赋值:

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;
}
传递指针没有任何好处。无论您传入的指针发生了什么变化,都不会使用原始值,这意味着它没有用处


记住,如果像传统那样最后声明
main()
main(),则不需要预先声明函数。不要忘记在该函数中返回一个
int
。编译时,使用
-Wall
警告常见错误。

您试图将变量的内容复制到未分配的poniter。如果它只是引用,那么它可能已经工作了。那么当我只发送名称时会发生什么,它是一个指针,所以它被传递为值,它是通过值传递的,是的,就像C.中的一切一样,只有C++才有能力通过引用传递。C可以通过值传入,但该值是指向指针的指针,这类似于引用,只是需要显式取消引用才能产生效果。谢谢,好的,我知道它不会超过这个值size@gbox如果将来在其他情况下需要,您将知道如何做^^
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;
}