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

あなたの問題はreturn name、関数が戻った後にスコープ外になったスタック変数のアドレスを返すことです。

これを修正する方法はいくつかあります (少なくとも)。

1 つ目は、アドレスを関数のに割り当ててから渡す方法です。

char *getname (char *buff) {
    strcpy (buff, "pax");
    return buff;
}

char name[20];
printf ("Name is '%s'\n", getname (name));

2 つ目は、関数の終了時にスコープ外に出ない割り当て関数を使用することです(ポインターは返される可能性がありますが、それらを戻す限り、割り当てられたメモリにアクセスできます)。

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 に答える
1

のスコープはnam関数 getname() に対してローカルです。 ポインターnamを介してアドレスを返していますname

const char * getname(){
     char nam[10];
     :
     name = nam;
     return name;
}

nam;動的にメモリを割り当てます。お気に入り:

nam = malloc(sizeof(char)*10);

さらに、 bufferoverun don't use が存在する可能性があります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 に答える
0

namstatic を宣言すると、次のこともできます。

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

注意: このコードは、namグローバルに宣言されているかのように扱われるため、スレッドセーフではありません。

于 2013-02-22T12:11:09.993 に答える