2017-01-08 20 views
-2

私はインタビューの準備をしており、私が理解できなかった練習問題を見つけました。コードは次のとおりです。このコードにはバグがありますが、見つけられません

#include <stdio.h> 

int main() 
{ 
    char *p,*q; 
    p=(char *)malloc(25); 
    q=(char *) malloc(25); 
    strcpy(p,"amazon"); 
    strcpy(q,"hyd"); 
    strcat(p,q); 
    printf("%s\n",p); 
} 

コンパイルして実行しましたが、うまくいきました。コードに問題があり、初期化されていない変数と関係があると思われます。出力はamazonhydでなければなりません。誰かが私に何が欠けているかを教えてもらえますか?

編集:これは練習のインタビューの質問であり、このコードで何が問題なのかを質問しています。

+3

「コードに問題があります」と思われる点は何ですか? – artm

+0

'#include 'を省略したので、コンパイラはC90モードで動作する必要があり、 'malloc()'が 'int'を返すと仮定していますが、64ビットシステムの場合、 'int'と同じサイズなので、あなたはあらゆる種類の問題に遭遇します。あまり真剣に、#include も省略しました。ただし、C90モードによる前提は、文字列関数の操作に影響を与える可能性は低いです。 –

+0

あなたは[mallocの結果をキャストすることに関するこの質問]に興味があるかもしれません。(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –

答えて

5

が含まれています。

malloc関数にはstdlib.hが必要ですが、strcpystrcatにはstring.hが必要です。これらの関数がなければ、これらの関数はintに返されます。

これは、の場合に特に問題です。sizeof(int) != sizeof(void *)の場合です。暗黙定義は実際の定義と一致しないため、undefined behaviorを呼び出します。定義されていない動作のための方法の1つは、プログラムが適切に動作するように見えることです。ただし、この動作は保証されません。

プログラムが適合するためには、次のものを先頭に追加してください。

#include <stdlib.h> 
#include <string.h> 

また、このプログラムはメモリを割り当てますが、freeは割り当てません。 mallocへの各呼び出しには、対応するfreeの呼び出しが必要です。そうしないと、メモリリークが発生します。

メモリリークを修正するためにprintfを呼び出した後、以下を追加します。

+0

ヘッダーとメモリリークについて私に思い出させてくれてありがとう!私はこの練習問題の答えはありませんが、答えは明確で建設的です。 – JJDoeCoder

関連する問題