0

我试图将字符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

4 回答 4

3

nam变量具有函数范围。这意味着一旦函数结束,该变量的内存就会被释放。因此,指向您返回的内存的指针将不再有效。

您可以传入指针:(在这种情况下有点毫无意义,如您所见)

void getname(char *name)
{
  gets(name);
}

你可以malloc(不好,因为你需要free在某个时候再次使用它):

const char * getname(){
     char * name = malloc(10);
     gets(name);
     return name;
}
于 2013-02-22T08:51:11.480 回答
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;
}
于 2013-02-22T08:51:05.390 回答
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.
于 2013-02-22T08:51:32.623 回答
0

声明nam静态也可以:

const char * getname() {
  static char nam[10];
  ...

注意:这段代码不是线程安全的,因为nam现在被视为全局声明的。

于 2013-02-22T12:11:09.993 回答