重复比较字符串返回错误值:C语言结构体字符串拷贝异常排查
问题分析与解决
核心问题:字符串数组空间不足,缺少终止符
C语言字符串必须以'\0'(空字符)作为结束标志,你代码里的两处数组定义都存在空间不足的问题:
- 结构体中的
char eth[4] char buffer[4] = "eth1"
这两个数组长度仅为4,刚好只能放下'e'、't'、'h'、'1'4个字符,完全没有空间存储字符串结束符'\0'。这会引发一系列异常:
strcpy拷贝时会越界写入,破坏相邻内存(比如后续结构体的成员)strlen、strcmp这类依赖'\0'的函数会读取超出数组范围的内存,行为不可预测- 第一次循环时,
static类型数组默认初始化为全0,obj[0].eth是合法空字符串,strcmp能匹配;但拷贝后越界的'\0'可能刚好存在于内存中,后续循环因内存被之前的越界操作破坏,无法正确识别字符串。
修复步骤
- 增大数组长度:把结构体的
eth数组和buffer数组长度改为5,留出存储'\0'的空间:typedef struct interface_data { char eth[5]; // 改为5,容纳"eth1" + '\0' int cnt; } interface; // 主函数内的buffer同步修改 char buffer[5] = "eth1"; - 移除多余的终止符赋值:代码里的
obj[i].eth[len] = '\0';完全多余,甚至可能越界。strcpy在源字符串合法(带'\0')的情况下,会自动将'\0'拷贝到目标数组中。 - 可选优化:无需
buffer变量,直接用strcpy(obj[i].eth, "eth1");更简洁,避免额外变量的潜在问题。
修复后的完整代码
typedef struct interface_data { char eth[5]; int cnt; } interface; int main() { static interface obj[3]; int i = 0; int len; char buffer[5] = "eth1"; for(i = 0 ; i < 3; i++){ if(strcmp(obj[i].eth,"") == 0) printf("yes\n"); strcpy(obj[i].eth,buffer); len = strlen(obj[i].eth); printf("%d len of string\n",len); obj[i].cnt = i; len = strcmp(obj[i].eth,"eth1"); if(len == 0) printf("true\n"); else printf("\n%d wrong data\n",len); char *p = obj[i].eth; while(*p != '\0') { printf("%c\t",*p); p++; } printf("\ndata %s and cnt %d\n",obj[i].eth,obj[i].cnt); } return 0; }
补充说明
static修饰的全局/局部数组会被默认初始化为全0,所以第一次循环时obj[0].eth是合法空字符串;但非static的局部数组不会初始化,内部是随机值,此时用strcmp和""比较会触发异常。- 字符串操作必须确保目标数组有足够空间容纳源字符串(包括
'\0'),否则会触发未定义行为,程序可能崩溃、输出异常结果,或在不同环境下表现不一致。
内容的提问来源于stack exchange,提问作者user7809950
相关产品推荐
相关产品推荐

