我有一个简单的 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;
}
看起来我已经为每行 256 个字符分配了一个数组(在 32 位机器上为1024字节位)。即使我ohai.txt
在第一行填充了超过 1000 个字符的文本,程序也不会出现段错误,我认为它会发生段错误,因为它溢出了分配给它的output[]
数组指定的可用空间量。
我的假设是操作系统会给程序额外的内存,而它有额外的内存可供使用。这意味着程序只会在一行文本消耗的内存ohai.txt
导致堆栈溢出时崩溃。
即使文本文件的一行中的字符数远大于 256,也可以在 C 和内存管理方面有更多经验的人支持或反驳我关于为什么该程序不会崩溃的假设吗?