私はmallocとreallocを試していて、次の問題のコードを考え出しました。
制限を設定せずに、サイズが不明な文字列を作成したい。ユーザーに文字の数を要求することもできますが、ユーザーが各文字を入力するときにstrのサイズを変更します。
だから私はmalloc+reallocでこれをやろうとしていて、ユーザーが新しい文字を入力するたびに、reallocを使用して文字を保持するための+1個のメモリを要求するという考えでした。
これを実装しようとしているときに、私は間違いを犯し、次のことを行うことになりました。
int main () {
/* this simulates the source of the chars... */
/* in reality I would do getch or getchar in the while loop below... */
char source[10];
int i, j;
for (i=0, j=65; i<10; i++, j++) {
source[i] = j;
}
/* relevant code starts here */
char *str = malloc(2 * sizeof(char)); /* space for 1 char + '\0' */
int current_size = 1;
i = 0;
while(i<10) {
char temp = source[i];
str[current_size-1] = temp;
str[current_size] = '\0';
current_size++;
printf("new str = '%s' | len = %d\n", str, strlen(str));
i++;
}
printf("\nstr final = %s\n", str);
return 0;
}
realloc部分はまだ実装されていないことに注意してください。
このコードをコンパイルして実行すると、次の出力が得られました
new str = 'A' | len = 1
new str = 'AB' | len = 2
new str = 'ABC' | len = 3
new str = 'ABCD' | len = 4
new str = 'ABCDE' | len = 5
new str = 'ABCDEF' | len = 6
new str = 'ABCDEFG' | len = 7
new str = 'ABCDEFGH' | len = 8
new str = 'ABCDEFGHI' | len = 9
new str = 'ABCDEFGHIJ' | len = 10
プログラムがクラッシュすると予想したため、これらの結果は奇妙でした。strには2文字のスペースがあり、コードはメモリを要求せずに2文字を超える文字をstrに追加しています。私の理解では、これは私が所有していないメモリに書き込んでいることを意味するため、ランタイムエラーが発生するはずです。
それで...なぜこれが機能するのですか?
(コンパイラーはGCC 4.3.4です。)
前もって感謝します。
編集: free()を呼び出すと、エラーが通知される可能性があることを示唆しているコメント投稿者の1人。上記のコードでfree()を呼び出してみましたが、コードを実行してもエラーは発生しませんでした。ただし、ソース配列にアイテムを追加し、freeを呼び出した後、次のエラーが発生しました。
*glibcが検出されました./prog:free():無効な次のサイズ(高速):0x09d67008 * *