我有一个utitlity函数,当我为它提供一个结构时,它给了我一个单独字节的char缓冲区。
unsigned char complete[16] = { 0 };
char* construct_complete_array(socketType* m)
{
unsigned char *temp = (unsigned char*) m;
size_t j;
for (j = 0; j < sizeof(*m); j++)
{
complete[j] = *(temp);
printf("%.2x ", *(temp));
*temp++;
}
return complete;
}
int diff_bit_calc(socketType* datanode, socketType* knode)
{
char* result = construct_complete_array(datanode);
size_t j;
printf("\nPrinting result: \n");
for (j = 0; j < sizeof(*datanode); j++)
{
printf("%.2x ", *(result));
*result++;
}
}
我希望它是一个通用函数,当提供结构时会返回一个结构的char缓冲区。 我可能有另一个调用,如
char* result1 = construct_complete_array(knode);
(我不认为让complete[16] buffer
成为全球性的好主意。让它本地化并返回它仍然是一个更糟糕的想法。)
答案 0 :(得分:3)
通常,如果不动态分配内存,则无法执行此操作。大多数人通过在调用函数中声明缓冲区并将该缓冲区传递给函数来解决它,然后填充传递的缓冲区。
在您的具体情况下,我不太确定某项功能是否必要;内联它是相当短的,例如:
/* to get the bytes representing `something' into a char array */
char something_chars[sizeof(something)];
memcpy(something_chars, &something, sizeof(something));
答案 1 :(得分:1)
据我所知,有两种方法可以做到这一点。 由于函数的返回值是指针,因此必须确保不会销毁存储结果的内存。除了使用全局变量之外,您还可以使用动态分配内存(如icktoofay所述)或静态关键字 (像Tay Wee Wen说的那样)。
顺便说一下,*temp++;
有点奇怪,为什么不使用temp++;
。
答案 2 :(得分:0)
在函数内声明数组static。
char* construct_complete_array(socketType* m){
static unsigned char complete[16]= {0};
unsigned char *temp = (unsigned char*)m;
size_t j;
for (j = 0;j<sizeof(*m);j++){
complete[j] = *(temp);
printf("%.2x ", *(temp));
*temp++;
}
return complete;
}
答案 3 :(得分:0)
您必须稍微更改一下界面:
char* construct_complete_array(socketType* m, char temp[]);
然后在调用方面,您可以使用复合文字来提供temp
char* result = construct_complete_array(datanode, (char[sizeof *datanode]){ 0 });
如果你必须在几个地方重复这个,你可以将它放入一个宏
#define CONSTRUCT_ARRAY(X) construct_complete_array((X), (char[sizeof *(X)]){ 0 })
所以你的呼叫方面看起来几乎和之前一样
char* result = CONSTRUCT_ARRAY(datanode);
要实现这一目标,您必须记住result
中的值指向本地数据,其生命周期与result
本身相同。