0

文字列の場合、予測できない動作が発生しています。次のようになります。

 int main()
        {

          char *str = charfun();

          printf("%s",str);  // This is printing garbage values

          printf("%c%c%c%c",str[0],str[1],str[2],str[3]); /* if I am printing  
          like this it is printing the result "Helo" why is it so ?
          and str[4] is '\0' (checked its ASCII value)*/
          return 0;
        }

        char* charfun()
        {
          char a[10]="Helo";
          return a;
        }

編集 -

私が心配しているのは、私が返す地元の住所ではありません。しかし、2つのprintfが従う印刷方法論を理解し、異なる結果を出したいです。

4

2 に答える 2

5

これは、aincharfun()がローカル配列であるためです。charfun()戻ると、のaアドレスが に割り当てられますがstr、それが指す配列は既に無効化されています。

于 2012-09-21T00:12:27.890 に答える
2

ここでの問題は、ローカル変数を作成するとスタックに割り当てられるため、関数の実行が終了すると使用できなくなることです。望ましい方法は、malloc() を使用して非ローカル メモリを予約することです。文字列aは関数に対してローカルであり、それへのポインターを返すことはできません。Undefined Behaviorしたがって、malloc を使用してスタックではなくヒープに割り当てる必要があります。

char *charfun(){
    char *a = malloc(sizeof(char)*10);
    strcpy(a,"Helo");
    return a;
}
于 2012-09-21T00:15:15.297 に答える