从C中的列表中取消引用结构中的变量

时间:2014-02-13 00:22:58

标签: c pointers struct

我试图在列表中的结构中取消引用变量,所以这里是我的列表和结构

struct packet {
 unsigned short block_num;
 unsigned short block_size;
 unsigned short crc;
 unsigned char  *payload;
}packet;

/ *数据包列表的函数和类型声明* /

typedef struct List{
    struct packet *p;
    struct List *next;
}List;

我在这里尝试做一个toString():

char *tostring(List *h) {
 char *str= malloc(STRSIZE);
 char num[sizeof(List)*100];
 str[0] = '\0';
 while (h != NULL) {
     sprintf(num, "package Number: %d \n", h->p->block_num);
     sprintf(num, "block size: %d \n", h->p->block_size);
     sprintf(num, "CRC: %d", h->p->crc);
     strncat(str, num, STRSIZE - strlen(str) - 1);
     h = h->next;
 }
 return str;
}

我遇到了分段错误,请帮忙,谢谢!

所以,在C#中,我将使用list.ElementAt(i).block_num,它是如何在C中完成的?

编辑:新的,问题在于我的解除引用

char *tostring(List *h) {
 char *str= malloc(STRSIZE);
 printf("line1");
 char num[sizeof(List)*100];
 char size[sizeof(List)*100];
 char crcs[sizeof(List)*100];
 char messages[sizeof(List)*100];
while (h != NULL) {
    sprintf(num, "package Number: %d \n", h->p->block_num);      
    sprintf(size, "block size: %d \n", h->p->block_size);       
    sprintf(crcs, "CRC: %d", h->p->crc);
    sprintf(messages, "CRC: %s", h->p->payload);
    strncat(str,num,sizeof(num));
    strncat(str,size,sizeof(size));
    strncat(str,crcs,sizeof(crcs));
    strncat(str,messages,strlen(num));
    h = h->next;

}
return str;
}

2 个答案:

答案 0 :(得分:1)

您是否使用sizeof(*h)来确定数组中List个元素的数量?

sizeof(*h)返回List的大小。由于tostring()只是指向List的指针,因此无法知道指向的元素数量。

在任何情况下,您似乎都在将字符串写入此大小的字符数组。 List的大小与数组中元素的数量有什么关系?你想做什么?

答案 1 :(得分:0)

这里可能出现的问题很少

  1. 您的SRTSIZE可能很低,无法容纳您开始附加到str的所有文本。为此,你可以从一个大的缓冲区开始,以消除它。

  2. 从以前的答案中发布,你总是覆盖num。每次创建num后,你应该写'str'

  3. strncat实现似乎不正确。你应该使用strlen(num)。

    strncat(str,num,strlen(num));

  4. char * strncat(char * destination,const char * source,size_t num); 最后的参数是期望的     要追加的最大字符数。

    参考:http://www.cplusplus.com/reference/cstring/strncat/