LinuxでCで記述されたコードをコンパイルしてコード化しようとすると、次のエラーメッセージが表示されます。
glibcがmalloc()を検出しました:メモリ破損
理由がわかりません...
substring()は、開始インデックスと長さを指定することにより、元の文字列の一部を返すだけです。例えばsubstring( "this is example"、0,4)= "this";
char *substring(char* str, int start, int length) {
char *newString = (char *)malloc(length * sizeof(char));
int i, x = 0;
int end=start+length-1;
for(i = start ; i <= end; i++){
newString[x++] = str[i];
}
newString[x] = '\0';
return newString;
}
getCharIndexFirst()は、指定された文字の最初の出現のインデックスを返すだけです。getCharIndexLast()は、指定された文字の最後の出現のインデックスを返すだけです。
以下は主な機能です。
//consoleCommand has the form of 'send MESSAGE ID', has the value from stdin
int firstSpace = getCharIndexFirst(consoleCommand,' ');
int lastSpace = getCharIndexLast(consoleCommand,' ');
int len = strlen(consoleCommand);
char *header = substring(consoleCommand,0,firstSpace);
printf("header is: %s\n",header);
char *cmd = substring(consoleCommand,firstSpace+1,lastSpace-firstSpace-1);
printf("command is: %s\n",cmd); // the code only runs up to here and output the error..
char *socketstr = substring(consoleCommand,lastSpace+1,len-lastSpace-1);
printf("socket is: %s\n",socketstr);
詳細はこちら:consoleCommandは通常stdinであり、「send MESSAGE ID」の形式で、MESSAGEが12文字の長さの場合にエラーが発生します...例:「このメッセージを送信4」、「このメッセージ'はcmdで、長さは12文字です。これによりエラーが発生します!他の長さでも問題なく動作します。3、4、24を試しました...
どんなヒントでもありがたいです、ありがとう!
newString[x] = '\0';
この時点で、x
はlength
と等しくなります。これは、割り当てたメモリの終わりを超えて1文字を書き込んでいることを意味します。もう1文字にスペースを割り当てる必要があります。
終了する'\0'
文字にスペースを割り当てないため、この文字を書き込むために割り当てをオーバーフローします。割り当てでもこの文字を数える必要があります。
char *newString = (char *)malloc((length + 1) * sizeof(char));