【发布时间】:2013-05-24 05:52:36
【问题描述】:
我正在阅读 linux 上的标准输入。我提供读取的缓冲区长度不足(只有两个字符),缓冲区应该溢出并且应该发生分段错误。但是程序运行正常。为什么?
编译:
gcc file.c -ansi
运行于:
echo abcd | ./a.out
程序:
#include<stdio.h>
#define STDIN 0
int main() {
/* This buffer is intentionally too small for input */
char * smallBuffer = (char *) malloc( sizeof(char) * 2 );
int readedBytes;
readedBytes = read(STDIN, smallBuffer, sizeof(char) * 4);
printf("Readed: %i, String:'%s'\n", readedBytes, smallBuffer);
return 0;
}
输出:
Readed: 4, String:'abcd'
【问题讨论】:
-
您不需要在 C 程序中强制转换
malloc()的返回值。而sizeof(char)是1。 -
您碰巧碰到了仍然属于您的进程的内存。您可能会遇到可怕的运行时错误,因为其他变量会在真实代码中被覆盖。这是未定义的行为。