0

我有一个实用函数,当我为它提供一个结构时,它给了我一个单独字节的 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* result1 = construct_complete_array(knode);

(我不认为将其complete[16] buffer作为全球性的好主意。将其本地化并返回它仍然是一个更糟糕的主意。)

4

4 回答 4

3

通常,如果不动态分配内存,您就无法做到这一点。大多数人通过在调用函数中声明缓冲区并将该缓冲区传递给函数来解决它,然后该函数将填充传递的缓冲区。

在您的具体情况下,我不太确定是否需要某个功能;内联执行它相当短,例如:

/* to get the bytes representing `something' into a char array */
char something_chars[sizeof(something)];
memcpy(something_chars, &something, sizeof(something));
于 2013-09-28T05:08:09.540 回答
1

据我所知,有两种方法可以做到这一点。由于函数的返回值是一个指针,所以你必须确保你存储结果的内存不会被破坏。除了使用全局变量,您还可以使用动态分配内存(如 icktoofay 所说)或静态关键字(如 Tay Wee Wen 所说)。

  • 当使用动态分配内存时,这个函数的用户应该记住在函数外释放()
  • 在块内使用 static 关键字时,存在覆盖的问题。如果多次调用该函数,则只保留最后一个返回值。

顺便说一句,*temp++;有点奇怪,为什么不用temp++;代替。

于 2013-09-28T13:08:34.673 回答
0

在函数内部声明数组静态。

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;
}
于 2013-09-28T05:06:27.500 回答
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);

为此,您只需要记住 in 的值result指向与result自身具有相同生命周期的本地数据。

于 2013-09-28T07:04:25.867 回答