テキストファイルを行ごとに読み取り、その内容をコンソールに出力することを示す単純な C ファイル I/O プログラムがあります。
/**
* simple C program demonstrating how
* to read an entire text file
*/
#include <stdio.h>
#include <stdlib.h>
#define FILENAME "ohai.txt"
int main(void)
{
// open a file for reading
FILE* fp = fopen(FILENAME, "r");
// check for successful open
if(fp == NULL)
{
printf("couldn't open %s\n", FILENAME);
return 1;
}
// size of each line
char output[256];
// read from the file
while(fgets(output, sizeof(output), fp) != NULL)
printf("%s", output);
// report the error if we didn't reach the end of file
if(!feof(fp))
{
printf("Couldn't read entire file\n");
fclose(fp);
return 1;
}
// close the file
fclose(fp);
return 0;
}
1 行あたり 256 文字 ( 32 ビット マシンでは1024バイトビット) のスペースを持つ配列を割り当てたようです。最初の行にohai.txt
1000 文字を超えるテキストを入力しても、output[]
配列によって指定された割り当てられた使用可能なスペースをオーバーフローしたため、プログラムはセグメンテーション違反を起こしませんでした。
私の仮説は、オペレーティング システムが追加のメモリをプログラムに提供する一方で、追加のメモリをプログラムに提供するというものです。これは、テキスト行によって消費されたメモリohai.txt
がスタックオーバーフローになった場合にのみ、プログラムがクラッシュすることを意味します。
テキスト ファイルの 1 行の文字数が 256 よりもはるかに多い場合でも、このプログラムがクラッシュしない理由について、C とメモリ管理の経験が豊富な人がサポートしてくれるか、私の仮説に反論してくれませんか?