我有一个结构框架:
typedef struct frame{
unsigned char type;
unsigned char seq;
int size;
char *payload;
}FRAME;
我有一个FRAMES数组,我想连接第一个:
frames[0].type='d';
frames[0].seq=seq;
frames[0].size=(int)strlen(f);
frames[0].payload=f;
//check
printf("%c\n",frames[0].type);
printf("%c\n",frames[0].seq);
printf("%d\n",frames[0].size);
printf("%s\n",frames[0].payload);
int num=sizeof(frames[0].type)+sizeof(frames[0].seq)+sizeof(frames[0].size)+strlen(frames[0].payload);
printf("%d\n",num);
char *m=malloc(num*sizeof(char));
strcat(m,frames[0].type);
strcat(m,frames[0].seq);
strcat(m, frames[0].size);
strcat(m, frames[0].payload);
printf("%s",m);
但是他给了我" strcat中的分段错误" ... 有人可以帮我弄这个吗?
答案 0 :(得分:2)
问题在这里:
char *m=malloc(num*sizeof(char));
strcat(m,frames[0].type);
malloc()
没有初始化分配的内存。因此,您无法strcat()
'\0'
,因为m
中没有0终结符(char *m=malloc(num*sizeof(char));
m[0] = 0;
)。
您可以使用以下命令对其进行初始化:
malloc()
您还应该检查NULL
是否失败,即检查它是否返回{{1}}。
答案 1 :(得分:1)
strcat
函数要求目标已包含有效字符串,这意味着它应具有终结符'\0'
。当您使用malloc
时,它根本没有初始化分配的内存,其内容是不确定并读取该内存(strcat
执行以查找终结符)到undefined behavior。
还有其他 严重的 问题,例如您使用结构成员作为字符串,但它们不是!您根本无法使用strcat
或其他类似功能(例如strcpy
)。你可以用例如snprintf
但是你没有分配足够的内存来存储结构中的所有数据,例如整数的大小是4个字节,但是它可以包含 10个个数字(加上负数可能'-'
。
我建议的解决方案:
size_t size = 1 + 1 + 11 + strlen(frames[i].payload) + 1;
// 1 for type
// 1 for seq
// 11 for the integer (assuming it's 4 bytes)
// strlen(...) for string
// 1 for terminator
char *m = malloc(size);
snprintf(m, size, "%c%c%11.11d%s",
frames[i].type,
frames[i].seq,
frames[i].size,
frames[i].payload);
答案 2 :(得分:0)
除了其他答案strcat
之外,要求源为char *
并且是有效字符串。
您只是在这里提供unsigned char
:
strcat(m,frames[0].type);
strcat(m,frames[0].seq);
和int
在这里
strcat(m,frames[0].size);
是输出二进制还是字符串?