【问题标题】:passing array of ints to functions which expects chars in C将整数数组传递给需要 C 中字符的函数
【发布时间】:2013-03-22 12:25:15
【问题描述】:

如何将无符号整数缓冲区传递给期望无符号字符缓冲区的函数?该函数将操作并更新缓冲区。 接下来是我想要实现的伪代码。

unsigned int* inputBuffer = (unsigned int*)malloc(bufferSize);

function(inputBuffer); <- How to perform this correctly?

bool function(unsigned char *buffer)
{
  ...operate and update values of buffer
}

【问题讨论】:

  • 你为什么曾经这样做?
  • 这似乎是个坏主意。
  • @Abhineet 不,类型转换只会隐藏问题。
  • 当你可以在“bool function()”中操作和更新缓冲区的值时,为什么不能纠正所需的输入参数或者如果不确定就使用void指针。
  • @Abhineet 请参考我上面的评论。

标签: c arrays casting char int


【解决方案1】:

这取决于函数的作用。如果它对缓冲区中的字节进行操作(如memcpymemcmp 等),则只需转换指针:

function((unsigned char *)inputBuffer);

如果函数对缓冲区中的元素(整数)进行操作,那么您必须将全部内容复制到临时缓冲区中:

size_t nelems = bufferSize / sizeof(unsigned int);
unsigned char *temp = malloc(nelems);
if (temp == NULL)
    // handle error

for (size_t i=0; i < nelems; i++)
    temp[i] = (unsigned char)(inputBuffer[i]);
function(temp);

// copy results back into inputBuffer
free(temp);

但是,如果您发现需要执行这样的操作,那么您的程序中可能存在设计缺陷。除非您使用设计不佳的库,否则您根本不应该这样做。

【讨论】:

    【解决方案2】:

    int 和 char 的大小不同。将整数数组传递给期望字符数组的函数将导致该函数将每个整数视为(不一定但通常)4个字符。 您将需要重组其余代码以使用 char 数组,或者创建一个临时 char 数组,将每个元素复制到其中,然后调用函数并将每个元素复制回来。

    但是,“你为什么要这样做”(H2CO3 的评论)的问题仍然存在;不同的情况需要不同的解决方案。

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 2014-10-27
      • 2018-12-24
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多