所以我想让用户input
进入我的string
并打印出来:
char *fname ;
getname(fname);
printf("%s", &fname);
void getname(char *fnam e)
{
fname = (char *)malloc(30);
gets(fname);
}
所以我有错误:
未初始化的本地变量'fname'
编辑:
我只有这段代码,看看这段代码有什么不对,不要用不同的方法。
答案 0 :(得分:4)
C是按值传递的。所以fname
没有变化。要进行更改,您必须传递地址。
getname(&fname);
然后
#define LEN 30
void getname(char **fname)
{
*fname = malloc(LEN);
if((*fname) == NULL ){ perror("malloc"); exit(1);}
if(fgets(*fname,LEN,stdin)==NULL){
fpritnf(stderr,"Error in input");
exit(1);
}
}
此上下文中的printf
用法是
printf("%s", fname);
不要使用gets
它已被弃用。完成后,释放动态分配的内存。
main()
中的
char *fname ;
getname(&fname);
printf("%s", fname);
free(fname);
也不需要强制转换malloc
,因为void*
到char*
转换是隐式完成的。
答案 1 :(得分:1)
不要使用'获取'它已被弃用。 ' FNAME'是指向单位化内存的指针。使用此:
char *fname = malloc(30);
getname(fname);
printf("%s", fname);
void getname(char *fname)
{
fgets(fname, 30, stdin);
}
答案 2 :(得分:0)
您需要拥有main()
功能。 C不会执行不在函数内部的随机代码。尝试重写它看起来像这样:
void getname(char *fname)
{
fname = (char *)malloc(30);
gets(fname);
}
int main(void){
char* fname;
getname(fname);
puts(fname);
}
好的,现在我们可以分析一下。
发生的事情是,当您将指针(或任何变量)传递给函数时,指针会被复制。执行fname = malloc(30);
后,函数中的fname
将设置为malloc
的指针,但main中的原始fname
保持不变。因此,当getname
返回main
时,fname
仍然未初始化。
您要做的是在main中分配fname
,或从getname
返回指针。所以这样的事情会起作用:
void getname(char *fname)
{
gets(fname);
}
int main(void){
char* fname = malloc(30); // OR
char fname2[30];
getname(fname);
puts(fname);
}
这样:
char* getname(void)
{
fname = (char *)malloc(30);
gets(fname);
return fname;
}
int main(void){
char* fname = getname();
puts(fname);
}