2013-02-21 76 views
0

对于我的网络类,我们正在构建基于UDP协议的BitTorrent客户端,这非常酷,但由于某些原因,我在C字符串方面遇到了很多麻烦。char *数组不保留价值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循环,数组中的每个点都包含相同的字符串值。

我不知道为什么会发生这种情况,我真的很想了解从开始到结束,数组内容如何变化,尽管我通过读入的循环的每次迭代来验证它们一次一个数据包。

+2

'server_data [i] =“”;/*内存泄露* /' – FatalError 2013-02-21 05:26:34

+0

如果你做'malloc(sizeof(char *));'你只分配四个或八个字节。 – 2013-02-21 05:41:06

回答

3

这条线的问题是:

server_data[i] = ""; 

覆盖分配的指针,有一个指向字符串常量。由于字符串文字无法修改,如果您稍后复制到此指针中,您会遇到未定义的行为

如果你想确保字符串为空,要么使用calloc,第一个字符设置为'\0',或在新的字符串中使用strcpy副本

+0

是的,没有解决它。 – barndog 2013-02-21 05:36:40

+0

@shadow然后你需要显示你在你分配和你打印的内容。 – 2013-02-21 05:39:12

+0

这就是我所做的。而已。 – barndog 2013-02-21 05:39:27

0

有几个问题会在这里:

1)首先,SERVER_DATA,如果它被声明为一个char **,可能会或可能不会是空的蝙蝠,除非你声明它如此。我不确定你是否将它初始化为NULL。明确地将它初始化为NULL是一个好主意。

2)我不知道如果你打算为数组server_data的每个项目持有一个char *(换句话说,一个字符串的引用),或者该数组是一个字符串本身。是one_block.payload一个字符串,或一组指针字符串?

我用一些测试值运行你的代码,我个人没有得到任何意外的值的问题......我认为这个问题可能是如何建立持有有效载荷数据的结构。你能告诉我们你的one_block结构吗?什么类型的变量/数组是one_block.payload?

+0

谢谢,但我已经明白了@Joachim Pileborg。它必须处理不合适的数量,而不是使用strcpy。 – barndog 2013-02-21 08:05:16