我正在尝试将一些字符串连接到缓冲区。但是,如果我重复调用该函数,缓冲区的大小将不断增长。
void print_message(char *str) {
char message[8196];
sender *m = senderlist;
while(m) {
/* note: stricmp() is a case-insensitive version of strcmp() */
if(stricmp(m->sender,str)==0) {
strcat(message,m->sender);
strcat(message,", ");
}
m = m->next;
}
printf("strlen: %i",strlen(message));
printf("Message: %s\n",message);
return;
}
消息的大小将不断增长,直到长度达到 3799。
示例:
- 第一。调用:strlen = 211
- 第二次调用:strlen = 514
- 第三次调用:strlen = 844
- ...
- 第 n 次调用:strlen = 3799
- 第 n 个 +1 调用:strlen = 3799
- 第 n 个 +2 调用:strlen = 3799
我的理解是,像 char[] 这样的静态分配变量将在退出函数时自动释放,并且我不会在堆上动态分配任何内容。
为什么会在 3799 字节时突然停止增长?感谢您的指点。
最佳答案
在缓冲区定义后添加一条语句
char message[8196];
message[0] = '\0';
或者在定义缓冲区时对其进行初始化
char message[8196] = { '\0' };
或
char message[8196] = "";
这与之前的初始化完全等效。
代码的问题是,如果您未显式指定初始化,则编译器不会初始化缓冲区。因此数组消息包含一些垃圾,但函数 strcat
首先在缓冲区中搜索终止零以附加新字符串。所以你的程序有未定义的行为。
关于c - 缓冲区溢出 - 退出函数后,字符数组未从堆栈中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647396/