c - 缓冲区溢出 - 退出函数后,字符数组未从堆栈中删除

标签 c string strcat

我正在尝试将一些字符串连接到缓冲区。但是,如果我重复调用该函数,缓冲区的大小将不断增长。

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/

相关文章:

c - 我的 strcat 代码中的 printf 有什么问题?

C:隐藏静态函数的公共(public)别名

c - 在 lubuntu 上使用 gcc 编译器运行 c

c - fgets() 在末尾包含换行符

Java 属性对象到字符串

Python:替换反斜杠以避免字符串中的转义序列

c - c中共享内存的重新分配

java - 矩阵 : get value from given matrix

c - 在声明中搜索我的名字!在c程序中使用字符串函数

c - strcat() 的访问冲突