返回的字符串值变为垃圾
我试图将字符array
值传递给字符pointer
。 然后将此值返回给正在调用它的方法,但在返回之后,该值将变为垃圾。 谁能帮我?
#include const char * getname(){ char nam[10]; char * name; gets(nam); name = nam; return name; } main(){ printf("%s",getname()); getch(); }
一切都很好,直到字符串返回
nam
范围是函数getname()的本地,你通过name
指针返回nam
地址
const char * getname(){ char nam[10]; : name = nam; return name; }
为nam;
分配内存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; }
nam
变量具有函数范围。 这意味着一旦函数结束,就释放该变量的内存。 因此,指向您返回的内存的指针将不再有效。
你可以传入指针:(在这种情况下有点无意义,你可以看到)
void getname(char *name) { gets(name); }
你可以malloc
(坏,因为那时你需要在某个时候再次free
它):
const char * getname(){ char * name = malloc(10); gets(name); return name; }
您的问题是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.
声明nam
static也可以:
const char * getname() { static char nam[10]; ...
注意:此代码不是线程安全的,因为现在将nam
视为全局声明。