如何在cpp中使用realloc

时间:2016-11-02 21:12:46

标签: c++ realloc

我有以下cpp代码

#include <stdio.h>         /*utiliser printf*/
#include <fcntl.h>
#include <math.h>          /*utiliser pour les formules de math*/
#include <malloc.h>
#include <iostream.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

  /* Le type nombre complexe */
typedef struct {
  double Preel;
  double Pimaginaire;
} COMPLEXE;

#define ALLOC_ERROR 1

void indienne(double *MatE, int tE, int nE, double *SortieExp, double *Tempbis)
{
  double *TempE=NULL, *SortieE=NULL;
  int *dec=NULL;
  int i, tampon, kE;
  kE=(int)(log(nE)/log(2));
  if(nE==8)
    kE=3;

  /* ALLOCATION DES MATRICES*/

  if (!(TempE = (double *)calloc(tE * tE, sizeof(double))))
    exit(ALLOC_ERROR);

  printf("check1  te=%d, nE=%d",tE,nE);

  if (!(dec = (int *)realloc(kE , sizeof(int))))
    exit(ALLOC_ERROR);

  if (!(SortieE = (double *)calloc(tE * tE, sizeof(double))))
    exit(ALLOC_ERROR);

  printf("check2  te=%d",tE);
  memcpy(TempE,MatE,tE * tE * sizeof(double));

  for (i=0; i<tE; i++)
    *(Tempbis+(tE * i) + i) = 1.0;

  if (nE==1) 
  {
    memcpy(SortieExp, MatE, tE*tE*sizeof(double));
  }
  else
  {
    printf("kE=%d, nE=%d\n", kE, nE);
    if (nE%2==0) 
      decompose(kE, nE,dec);
    else 
      decompose(kE, nE-1, dec);

    for (i=0; i<kE; i++)
    {
      carre(TempE, tE, SortieE);
      memcpy(TempE, SortieE, tE*tE*sizeof(double));
      tampon=*(dec+i);

      if (tampon==1)
      {
        mult(Tempbis, tE, tE, SortieE, tE, tE, SortieExp);
        memcpy(Tempbis, SortieExp, tE*tE*sizeof(double));
      }
    }
    if (nE%2 !=0)
    {
      memcpy(Tempbis, SortieExp, tE*tE*sizeof(double));
      mult(Tempbis, tE, tE, MatE, tE, tE, SortieExp);
    }
  }
  free(TempE);
  free(SortieE);
  free(dec);
}

当我编译此代码后发生错误

  

来自&#39; int&#39;的无效转换到&#39;无效*&#39; [-fpermissive] |

关于以下代码行

if (!(dec = (int *)realloc(kE , sizeof(int))))

如何删除此错误?

2 个答案:

答案 0 :(得分:1)

您正在传递int kE作为第一个参数:

realloc(kE , sizeof(int))

然而,realloc is declared like this

void *realloc(void *ptr, size_t size);

换句话说,它需要一个指针!请阅读我链接到上面的手册页以获取更多详细信息。简而言之,你可能想要这样的错误行:

if (!(dec = (int *)realloc(dec , sizeof(int))))

请注意,这有点糟糕,因为如果realloc失败,则会丢失dec的原始值,从而导致内存泄漏。如果您要在出错时退出并不重要,否则您应该保留dec的原始值,这样您就可以更优雅地处理错误而不仅仅是退出。

另外请注意,真的应该使用像vector这样的C ++容器类,而不是使用C内存分配函数。

您的代码中可能还有其他问题,但这个答案不会尝试进行代码审查,而只是解释您收到错误的原因。

答案 1 :(得分:-1)

尝试不要这样做:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *pa = malloc(10 * sizeof *pa); // allocate an array of 10 int
    if(pa) {
        printf("%zu bytes allocated. Storing ints: ", 10*sizeof(int));
        for(int n = 0; n < 10; ++n)
            printf("%d ", pa[n] = n);
    }

    int *pb = realloc(pa, 1000000 * sizeof *pb); // reallocate array to a larger size
    if(pb) {
        printf("\n%zu bytes allocated, first 10 ints are: ", 1000000*sizeof(int));
        for(int n = 0; n < 10; ++n)
            printf("%d ", pb[n]); // show the array
        free(pb);
    } else { // if realloc failed, the original pointer needs to be freed
        free(pa);
    }
}