2016-06-12 4 views
1

私は以前の投稿を見てきました。関数からメインへのポインタを返そうとしています。ここで私が持っているものである...ここでcの関数からmainへのポインタを戻す

#include <stdio.h> 
char* monthName() 
{ 
char month [20] = "January"; 
char* pMonth; 
pMonth = month; 
printf("Printing month from monthName function %s\n", month); 
/*while (*pMonth != '\0') 
    { 
    putch(*pMonth); 
    pMonth++; 
    }*/ 
return pMonth; 
} 
int main (void) 
{ 
char* monthName(); 
char* currentMonth; 
currentMonth = monthName(); 
putch('\n'); 
while (*currentMonth != '\0') 
    { 
    putch(*currentMonth); 
    currentMonth++; 
    } 
} 

はgdbの出力が

Breakpoint 1, monthName() at 132.c:4 
4  char month [20] = "January"; 
(gdb) n 
6  pMonth = month; 
(gdb) n 
7  printf("Printing month from monthName function %s\n", month); 
(gdb) p pMonth 
$7 = 0x61fee8 "January" 
(gdb) n 
Printing month from monthName function January 
13  return pMonth; 
(gdb) p pMonth 
$8 = 0x61fee8 "January" 
(gdb) n 
14  } 
(gdb) p pMonth 
$9 = 0x61fee8 "January" 
(gdb) n 
main() at 132.c:20 
20  putch('\n'); 
(gdb) p pMonth 
No symbol "pMonth" in current context. 
(gdb) q 
A debugging session is active. 

     Inferior 1 [process 7836] will be killed. 

Quit anyway? (y or n) y 
error return ../../gdb-7.6.1/gdb/windows-nat.c:1275 was 5 
+0

自動ストレージクラスのポインタをローカル変数に戻してください!そして、何か似たようなものが毎秒ここでポップアップしています –

+0

'char month [20] =" January " ; 'はローカル(自動)変数です。関数が返ってくると範囲外になるので、ポインタを返すのは*未定義の動作*です。 –

答えて

1

である私はあなたの問題はあなたがローカル変数を返すことかもしれないと思います。その変数は、その変数を作成したメソッドから離れると上書きされ、スタックは割り当てられた場所に拡大します。

代わりに、メソッドを終了した後に再利用されない永続メモリを割り当てる場合は、malloc()free()を調べる必要があります。

一部のマニュアル:http://www.programiz.com/c-programming/c-dynamic-memory-allocation

+1

Cにはメソッドがありません。 –

0

代替ことを注意してください(メインに地元の文字配列を割り当て、機能にそれを渡し、バッファに関数strcpyのかのmemcpyを持っていると返された値を用いることであろう本当におそらくstrcpynまたはmemcpyn(関数名を覚えていれば)指定した長さにコピーされたデータを制限する(バッファオーバーランを回避するために、nはバッファの長さに基づいている可能性があります)

関連する問題