返回的字符串值变为垃圾

时间:2013-02-22 08:48:58

标签: c string char return

我试图将字符array值传递给字符pointer。然后这个值被返回到一个调用它的方法,但是在它返回后,该值变为垃圾。有谁可以帮助我?

#include <stdio.h>

const char * getname(){
     char nam[10];
     char * name;
     gets(nam);
     name = nam;
     return name;
}
main(){
       printf("%s",getname());
       getch();
}

一切都很好,直到字符串返回

4 个答案:

答案 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现在被视为全局声明。

相关问题