You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中int变量len值莫名自行改变的问题求助

为什么执行strcat后未关联的int变量len值被意外修改?

核心原因是数组越界(缓冲区溢出)导致的内存覆盖,和strcat本身无关,是你给str1分配的空间太小,追加str2时溢出覆盖了相邻内存里的len变量。

具体分析:

  1. str1的空间大小问题:
    你定义char str1[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'};时,数组的大小被自动设置为13字节(刚好容纳12个字符加终止符'\0'),没有多余空间。
  2. strcat的行为:
    strcat(str1, str2)会将str2的内容(包括所有字符,直到str2的'\0')追加到str1的末尾。str2本身是13字节("Hello World!"加终止符),追加后需要的总空间是12(str1原长度) + 12(str2长度) + 1(新终止符)=25字节,但str1只有13字节,必然发生缓冲区溢出。
  3. 内存覆盖的发生:
    在栈内存中,变量的存储位置是连续的,str1的内存区域后面刚好就是len变量的存储位置。溢出的字节会直接覆盖len的内存内容,导致它的值变成随机的垃圾数据(你看到的1919899424就是溢出写入的二进制数据对应的int值)。

解决方案:

  • 提前分配足够空间:把str1定义成足够大的数组,比如:
    char str1[100] = "Hello World!";
    
  • 动态计算并分配内存(更灵活):
    char *str1 = malloc(strlen("Hello World!") + strlen(str2) + 1);
    if (str1 == NULL) {
        // 处理内存分配失败的情况
        return 1;
    }
    strcpy(str1, "Hello World!");
    strcat(str1, str2);
    // 使用完后记得free(str1);
    

关键提醒:

C语言不会自动检查数组越界,缓冲区溢出属于未定义行为,可能导致数据损坏、程序崩溃甚至安全漏洞,编写代码时一定要确保目标缓冲区有足够的空间容纳操作后的内容。

内容的提问来源于stack exchange,提问作者GjdGr8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:25:37