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

C语言socket服务端接收字符串为何总是存入数组首位且比对异常

问题原因
  • 核心原因:仅存储字符串指针未拷贝内容
    你代码中received数组存储的是指向code缓冲区的指针,所有数组元素最终都指向同一块内存地址。每次你从socket接收新的字符串时,都会覆盖这块缓冲区的内容,导致之前存入数组的指针指向的内容同步被修改。这就是你对比的时候出现Compare BBB and BBB的原因:原本存在下标0的AAA因为缓冲区被新的BBB覆盖,所以读取出来已经变成了BBB,同时因为比对结果判定为重复,新的字符串永远不会被存入新的下标位置。
  • 次要问题:重复匹配逻辑未提前终止
    遍历数组匹配到重复字符串后没有添加break跳出循环,会做不必要的遍历操作,虽然不影响功能但会降低执行效率。
修复方案
  1. 存储新字符串时,先分配独立内存拷贝字符串内容,不要直接赋值指针
  2. 匹配到重复后添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:45:04