C语言socket服务端接收字符串为何总是存入数组首位且比对异常
问题原因
- 核心原因:仅存储字符串指针未拷贝内容
你代码中received数组存储的是指向code缓冲区的指针,所有数组元素最终都指向同一块内存地址。每次你从socket接收新的字符串时,都会覆盖这块缓冲区的内容,导致之前存入数组的指针指向的内容同步被修改。这就是你对比的时候出现Compare BBB and BBB的原因:原本存在下标0的AAA因为缓冲区被新的BBB覆盖,所以读取出来已经变成了BBB,同时因为比对结果判定为重复,新的字符串永远不会被存入新的下标位置。 - 次要问题:重复匹配逻辑未提前终止
遍历数组匹配到重复字符串后没有添加break跳出循环,会做不必要的遍历操作,虽然不影响功能但会降低执行效率。
修复方案
- 存储新字符串时,先分配独立内存拷贝字符串内容,不要直接赋值指针
- 匹配到重复后添加
break提前终止循环
修改后的代码示例:
int found = 0; if(array_size == 0){ printf("This is the first message received.\n"); // 分配独立内存拷贝字符串内容 received[array_size] = strdup(code); array_size = array_size+1; found= 0; printf("Code added to array. The number of messages is %d. It contains:\n", (int)array_size); for(int j=0; j<array_size; j++){ printf("Element n. %d -> %s\n", j, received[j]); } } else { printf("This is NOT the first message received. Size of array: %d\n", (int)array_size); for(int j=0; j<array_size; j++){ printf("Compare %s and %s\n", code, received[j]); if( (strcmp(code,received[j])) == 0){ found= 1; break; // 匹配到重复直接跳出循环 } } if(found== 0){ received[array_size] = strdup(code); // 同样拷贝内容 array_size = array_size+1; } }
注意事项
strdup是POSIX标准函数,如果你的编译环境不支持,可以替换为标准C的实现:
received[array_size] = malloc(strlen(code) + 1); strcpy(received[array_size], code);
- 程序退出前记得遍历
received数组,对每个元素调用free释放分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者TryToLearn
相关产品推荐
相关产品推荐

