我遇到了一个我不明白的问题,以下是我的代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
using namespace std;
int main(int argc, char **argv)
{
char *format = "The sum of the two numbers is: %d";
char *presult;
int sum = 10;
presult = (char *)calloc(sizeof(format) + 20, 1); //allocate 24 bytes
sprintf(presult, format, sum); // after this operation,
// the length of presult is 33
cout << presult << endl;
presult[40] = 'g'; //still no segfault here...
delete(presult);
}
我在不同的机器上编译了这段代码。在一台机器上,sizeof(format)是 4 个字节,而在另一台机器上,sizeof(format) 是 8 个字节;(在两台机器上,char只占用一个字节,这意味着sizeof(*format)等于 1)
但是,无论在哪台机器上,结果仍然让我感到困惑。因为即使对于第二台机器,分配的内存也只有 20 + 8 即 28 个字节,显然字符串的长度为 33,这意味着至少需要 33 个字节。但是在我运行这个程序后没有发生分段错误。如您所见,即使我尝试取消引用第 40 位的 presult,程序也不会崩溃并显示任何段错误信息。
谁能帮忙解释为什么?太感谢了。