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的的不只是在功能范围,所以哪里是错?
答案 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()
最后,因为是传统。也不要忘记在该函数中return
和int
。编译时,使用-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”