我试图将字符array
值传递给字符pointer
。然后这个值被返回到一个调用它的方法,但是在它返回后,该值变为垃圾。有谁可以帮助我?
#include <stdio.h>
const char * getname(){
char nam[10];
char * name;
gets(nam);
name = nam;
return name;
}
main(){
printf("%s",getname());
getch();
}
一切都很好,直到字符串返回
答案 0 :(得分:3)
nam
变量具有功能范围。这意味着一旦函数结束,就释放该变量的内存。因此,指向您返回的内存的指针将不再有效。
你可以传入指针:(在这种情况下,有点无意义,如你所见)
void getname(char *name)
{
gets(name);
}
你可以malloc
(不好,因为那时你需要再次free
):
const char * getname(){
char * name = malloc(10);
gets(name);
return name;
}
答案 1 :(得分:1)
nam
的范围是函数getname()的本地,您通过nam
指针返回name
地址
const char * getname(){
char nam[10];
:
name = nam;
return name;
}
动态分配nam;
的内存。喜欢:
nam = malloc(sizeof(char)*10);
另外可能有bufferoverun不使用gets()
,喜欢:
nam = malloc(sizeof(char)*10);
fgets( nam, 10, stdin );
您也不需要使用name
额外的变量简单return nam
是好的。
const char * getname(){
char * nam = malloc(sizeof(char)*10);
fgets( nam, 10, stdin );
return nam;
}
答案 2 :(得分:1)
你的问题是return name
正在返回一个堆栈变量的地址,一个在函数返回后超出范围的变量。
有几种方法可以解决这个问题(至少)。
第一个是将地址分配给在之外的函数,然后传入:
char *getname (char *buff) {
strcpy (buff, "pax");
return buff;
}
char name[20];
printf ("Name is '%s'\n", getname (name));
第二种是在函数退出时使用不超出范围的分配函数(指针可能但是,只要你传回它们,你仍然可以到达分配的内存):
char *getname (void) {
char *buff = malloc (21); // should really check this for failure.
strcpy (buff, "pax");
return buff;
}
buff = getname();
printf ("Name is '%s'\n", buff);
free (buff); // This is important, caller is responsible
// for freeing the memory.
答案 3 :(得分:0)
声明nam
静态也可以:
const char * getname() {
static char nam[10];
...
注意:此代码不是线程安全的,因为nam
现在被视为全局声明。