0

对于我的网络课程,我们正在构建一个基于 UDP 协议的 bittorrent 客户端,这非常酷,但由于某些原因,我在使用 C 字符串时遇到了很多麻烦。

第一次收到数据包时,我会:

if(server_data == NULL){
    server_data = malloc(one_block.total_blocks*sizeof(char*));
    int i;
    for(i = 0; i < one_block.total_blocks; i++){
        server_data[i] = malloc(sizeof(char*));
        server_data[i] = "";
    }
}

这里,server_data 是一个char**,one_block 是struct保存数据包信息和有效负载。

接下来我做:

server_data[one_block.which_block] = one_block.payload;
blocks_rcv++;
if(blocks_rcv == one_block.total_blocks-1)
    done = TRUE; //macro
if(done){
    int i;
    for(i = 0; i < one_block.total_blocks; i++){
        printf("%s", server_data[i];
    }
}

一切看起来都很好,但是无论出于什么疯狂的原因,当我在收到所有数据包之前打印 server_data 的内容时,我看到每个数据包的数据不同。之后我设置 done = TRUE 并进入那个 for 循环,数组中的每个点都包含相同的字符串值。

我不知道为什么会发生这种情况,我真的很想了解从帖子的开头到结尾,数组的内容如何变化,即使我通过循环的每次迭代来验证它们,该循环在一个数据包中读取时间。

4

2 回答 2

3

这条线是问题所在:

server_data[i] = "";

它用指向字符串文字的指针覆盖分配的指针。并且由于字符串文字不能被修改,如果你稍后复制到这个指针中,你会遇到未定义的行为

如果要确保字符串为空,请使用calloc,将第一个字符设置为'\0',或使用strcpy复制字符串。

于 2013-02-21T05:27:13.893 回答
0

这里有几个问题:

1) 首先,server_data,如果它被声明为 char**,则可能会或可能不会立即为空,除非您这样声明。我不确定您是否将其初始化为 NULL。将其显式初始化为 NULL 是个好主意。

2)如果您打算让数组 server_data 的每个项目都保存一个 char* (换句话说,对字符串的引用),或者让数组本身成为一个字符串,我不确定发生了什么。one_block.payload 是一个字符串,还是一组指向字符串的指针?

我用一些测试值运行了你的代码,我个人没有遇到任何意外值的问题......我认为问题可能在于保存有效负载数据的结构的设置方式。你能告诉我们你的 one_block 结构吗?one_block.payload 是什么类型的变量/数组?

于 2013-02-21T07:48:35.920 回答