次のコードがある場合、メイン関数にメモリを割り当ててから、関数に渡します。これにより、次のようにメモリがいっぱいになります。
main()
{
char *bar = (char*) malloc(sizeof(char));
while(1)
{
foo(bar);
free(bar);
bar = (char*) malloc(sizeof(char));
}
}
foo(char *bar)
{
int c;
int i = 0;
while((c = getchar()) != '\n' && c != EOF)
{
bar[i++] = c;
bar = (char*) realloc(bar, sizeof(char) * (i+1));
}
}
いくつかの入力後にセグメンテーション違反が発生します。ただし、これを行う場合:
main()
{
char *bar;
while(1)
{
bar = foo();
free(bar);
}
}
char *foo()
{
char *bar = (char*) malloc(sizeof(char));
int c;
int i = 0;
while((c = getchar()) != '\n' && c != EOF)
{
bar[i++] = c;
bar = (char*) realloc(bar, sizeof(char) * (i+1));
}
return bar;
}
つまり、関数にメモリ割り当てを配置すると、すべてが正常に機能しているように見えます。何故ですか?