[英]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.