C语言中int变量len值莫名自行改变的问题求助
为什么执行strcat后未关联的int变量len值被意外修改?
核心原因是数组越界(缓冲区溢出)导致的内存覆盖,和strcat本身无关,是你给str1分配的空间太小,追加str2时溢出覆盖了相邻内存里的len变量。
具体分析:
- str1的空间大小问题:
你定义char str1[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'};时,数组的大小被自动设置为13字节(刚好容纳12个字符加终止符'\0'),没有多余空间。 - strcat的行为:
strcat(str1, str2)会将str2的内容(包括所有字符,直到str2的'\0')追加到str1的末尾。str2本身是13字节("Hello World!"加终止符),追加后需要的总空间是12(str1原长度) + 12(str2长度) + 1(新终止符)=25字节,但str1只有13字节,必然发生缓冲区溢出。 - 内存覆盖的发生:
在栈内存中,变量的存储位置是连续的,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
相关产品推荐
相关产品推荐

