从不兼容的void *中分配int *

时间:2015-12-19 21:51:30

标签: c

我有这段代码:

int * generate_code(int *bits, int Fs, int size, int *signal_size, float frameRate)
{
  int sign_prev, i;
  int bit, t, j=0;
  int *x;
  float F0, N, t0, prev_i, F1;
  int temp = 0, temp1, temp2;

  F0 = frameRate * BITS_PER_FRAME;      // Frequency of a train of '0's = 2.4kHz
  F1 = 2*F0;       // Frequency of a train of '1's = 4.8kHz
  N = 2*(float)Fs/F1;   // number of samples in one bit

  sign_prev = -1;
  prev_i = 0;
  x = (int *)malloc(sizeof(int));
  for( i = 0 ; i < size ; i++)
  {

    t0 = (i + 1)*N;
    bit = bits[i];
    if( bit == 1 )
    {
      temp1 = (int)round(t0-N/2)-(int)round(prev_i+1)+1;
      temp2 = (int)round(t0)-(int)round(t0-N/2+1)+1;
      temp =j + temp1 + temp2;
      //printf("%d\n", (int)temp);
      x = realloc(x, sizeof(int)*temp);  // 1

      for(t=(int)round(prev_i+1); t<=(int)round(t0-N/2); t++)
      {
        *(x + j) = -sign_prev;
        j++;
      }
      prev_i = t0-N/2;
      for(t=(int)round(prev_i+1); t <= (int)round(t0); t++)
      {
        *(x + j) = sign_prev;
        j++;
      }
    }
    else
    {
      // '0' has single transition and changes sign
      temp =j + (int)round(t0)-(int)round(prev_i);
      //printf("%d\n",(int)temp);
      x = realloc(x, sizeof(int)*(int)temp);  // 2
      for(t=(int)round(prev_i); t < (int)round(t0); t++)
      {
        *(x + j) = -sign_prev;
        j++;
      }
      sign_prev = -sign_prev;
    }
    prev_i = t0;
  }

  *signal_size = j;
  return x;
}

前面代码中标有realloc//1的{​​{1}}行都给出了以下错误消息:

  

从不兼容的类型void *

分配给int *

因为我不希望这段代码表现得格外奇怪或者让我崩溃,显然,我会问:如果我只是通过

将其转换为//2,我将来会遇到一些问题。
int *

由于

3 个答案:

答案 0 :(得分:7)

在C中,类型void*的值(例如realloc返回的值)可以分配给类型为int*的变量,或任何其他对象指针类型。该值是隐式转换的。

错误消息最可能的解释是您将代码编译为C ++而不是C。确保源文件名以.c结尾,而不是.C或{ {1}},并确保您的编译器配置为C编译而不是C ++。

(转换.cpprealloc的结果在C中被视为不良风格。在C ++中,强制转换是必要的,但您通常不会使用malloc或{首先在C ++中{1}}。)

答案 1 :(得分:1)

这应该在C中工作。您是否可能使用C ++编译器来编译它?例如,一些位于雷德蒙德的大公司拒绝正确支持当代的C实现。他们的编译器默认是C ++,需要一些选项才能将它打入C编译器。

您是否包含stdlib.h?那你就不需要演员了。实际上,最佳做法是转换malloc返回。

答案 2 :(得分:1)

C中的所有WHERE - 样式函数返回具有最严格对齐的内存地址,因此强制转换不能给出一个不是有效SELECT * FROM ObjectToPerson LEFT JOIN Objects O ON O.Id = ObjectToPerson.ObjectId WHERE ObjectToPerson.ObjectTypeId IN(1,2) 指针的指针。