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