我试图在列表中的结构中取消引用变量,所以这里是我的列表和结构
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;
}
答案 0 :(得分:1)
您是否使用sizeof(*h)
来确定数组中List
个元素的数量?
sizeof(*h)
返回List
的大小。由于tostring()
只是指向List
的指针,因此无法知道指向的元素数量。
在任何情况下,您似乎都在将字符串写入此大小的字符数组。 List
的大小与数组中元素的数量有什么关系?你想做什么?
答案 1 :(得分:0)
这里可能出现的问题很少
您的SRTSIZE可能很低,无法容纳您开始附加到str的所有文本。为此,你可以从一个大的缓冲区开始,以消除它。
从以前的答案中发布,你总是覆盖num。每次创建num后,你应该写'str'
strncat实现似乎不正确。你应该使用strlen(num)。
strncat(str,num,strlen(num));
char * strncat(char * destination,const char * source,size_t num); 最后的参数是期望的 要追加的最大字符数。