Struct to String - strcat不起作用

时间:2014-11-23 12:09:42

标签: c string struct strcat

我有一个结构框架:

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中的分段错误" ... 有人可以帮我弄这个吗?

3 个答案:

答案 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);

是输出二进制还是字符串?