2016-03-19 13 views
0

私はCで遊んでいます。ベストプラクティスであり、何か間違っていたらいくつかの質問があります。私が動作しているようプログラムを作った関数間のポインタを渡す最善の方法

私もこのようにバージョンを見てきましたが
void main() 
{ 
    char *text; 
    text = malloc(10 * sizeof(char)); 
    dosomethingwithtext(text); 
    printf("%s\n", text); 
} 

:(私は任意の文字を追加していないので、それは意味のある何かを印刷しないことを知っていますしかし、私が持っていたと想像してください!)

void main() 
{ 
    char *text; 
    text = dosomething(); 
    printf("%s\n", text); 
} 
char * dosomething() 
{ 
    char *text; 
    text = malloc(10 * sizeof(char)); 
    return text; 
} 

またはいずれかが最適でない場合は、どのような方法が最適です。基本的に私はこれを行う最も一般的な/最善の方法を求めています。

+0

意見の種類に基づいていますが、どちらの場合でも大文字と小文字を区別する回答が得られると確信しています。 IMOは、両方の方法がどこに呼び出されるかによって利点があります。しかし、どちらの場合でも 'free()'ステートメントを覚えておく必要があります。 – ryyker

+1

'void main()'は 'main'の無効な署名であり、関数宣言子の非推奨構文です。 – Olaf

+0

@Olaf '関数の宣言子のために'非難された構文 '、あなたは展開できますか? – xvan

答えて

1

a)いずれの場合も、メモリの割り当てを解除できませんでした。 mallocへの呼び出しは、freeへの呼び出しによってバランスを取らなければなりません。

B)はsizeof(文字)がCで1として定義され、これはポイントがはsizeof(文字)

Cを呼び出すことはありません)それはそれはint main(void)、またはint main(int argc, char** args)だ、void main()ないです - あなたは、戻り値を提供する必要があります。

実際の質問に答えるには、どちらも問題ありません。おそらくあなたの2番目のケースでは、malloc()と同じ関数にfree()を置くことができないため、メモリを管理するのが難しくなります - dosomething()は割り当てられたブロックを返します。しかし、1つの場所に割り当て、別の場所に割り当てるプログラムで終わることは非常に一般的です。

+0

私は 'void *'からのキャストが廃止されたと信じています。 – chrylis

+2

Cの場合、キャストは必要ありません。 C++の場合は必須です。 – ryyker

+0

Cではまだ警告が表示される可能性があるので、ノイズを避ける方がよいでしょう。 – xvan

-1

オプション1は、同じスコープで割り振りと取り消しを行う利点があります。これは、完全に意見を基にしてのです。戻り値を使用して、何らかのステータスを報告できます。

オプション2は、Creational patternに従います。これは、管理されていないメモリではリークしがちです。唯一の可能性のあるステータスレポートはヌルポインタです。 (これで十分かもしれない)。

+0

ほとんどの重要でないコードは、割り当てられているのと同じスコープで 'free'コードをしません。割り当てられたメモリにエラーが発生しやすくなります。 – Olaf

+0

しかし、現代的なOSでメモリを割り当てるのを忘れるとデバッグが容易になります。リークを見つけるには、最初にリークがあることに気づく必要があります。 – xvan

+0

1)コメントを正しく記述してください。そうでない場合は、表示されないことがあります。それが言った:PCレベルよりもC言語でのプログラミングが多い。あなたの声明は、それが一般的ではないように真実ではありません。簡単な答えはありませんし、アプリケーションに強く依存しています。動的に割り当てられたメモリを持つ簡単ではないプログラムを書こうとすると、理解できるかもしれません。 – Olaf

関連する問題