重新分配一个指针,在哪里说“它是一个指针”?

Realloc a Pointer, where to say 'it's a pointer'?

我在使用 realloc 时遇到一个问题。我无法重新分配一个 int 数组。

现在 realloc 已修复,我唯一的问题是无法触发 for。目前是这样的:

int insereAIndice(int* Tab, int index, int insertion, int taille) {
    Tab = realloc(Tab, taille * sizeof (*Tab));
    int i;
    for (i = taille-1; i <= index+1 ; i--) {
        printf("%d", Tab[i]);
        Tab[i] = Tab[i-1];
    }
    return *Tab;
}

这是“重要”的一行:

*Tab = realloc(*Tab, taille * sizeof (*Tab));

下面是代码的其余部分:

Main.c

#include "functions.h"
#include "functions.c"

/*       TP 3 - ESIEE-IT Rémy JARDIN        */

int main() {
    int saisie, index, insertion, taille;


    // Création du tableau avec des valeurs aléatoires.
    printf("Creation du Tableau. \nNombre de caractere du tableau : ");
    scanf("%d", &saisie);

    int *Tab = ArrayCreate(saisie);

    printf("Voici le tableau nouvellement creer : \n");
    Affichage(Tab, saisie);


    // Insertion d'une valeur 'insertion' à l'index 'index'. Avec décallage.
    taille = saisie;

    printf("\n ! Mode Insertion ! \nNouvel Endroit souhaiter a partir de 0 : ");
    scanf("%d", &index);

    printf("Nouvelle valeur souhaiter : ");
    scanf("%d", &insertion);

    insereAIndice(Tab, index, insertion, taille);
    Affichage(Tab, saisie);
 
    free(Tab);
    return 0;
}

functions.h

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

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

int *ArrayCreate(int saisie);
int randomizer(void);
int insereAIndice(int* Tab, int index, int insertion, int taille);
int Affichage(int* Tab, int max);

#endif

functions.c

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


int *ArrayCreate(int saisie) {
    int i;
    int *Tab = malloc( saisie * sizeof (*Tab));
    if (Tab==NULL) {
        printf("Not enough Memory");
        exit (1);
    }
    for (i = 0; i < saisie; i++) {
        Tab[i] = randomizer();
    }
    return Tab;
}


int randomizer() {
    return 1 + rand() % 100;
}


int insereAIndice(int* Tab, int index, int insertion, int taille) {
    *Tab = realloc(*Tab, taille * sizeof (*Tab));
    int i;
    for (i = taille; i < index ; i--) {
        printf("\n - %d", Tab[i]);
    }
    return *Tab;
}


int Affichage(int* Tab, int max) {
    // Affichage
    int i;
    printf("\n Resultats : ");
    for (i = 0; i < max; i++) {
        printf("%d - ", Tab[i]);
    }
    return *Tab;
}

这就是 GCC 给我的:

functions.c: In function 'insereAIndice':
functions.c:26:20: warning: passing argument 1 of 'realloc' makes pointer from integer without a cast [-Wint-conversion]
     *Tab = realloc(*Tab, taille * sizeof (*Tab));
                    ^
In file included from functions.h:5:0,
                 from main.c:1:
f:\logiciel\mingw\include\stdlib.h:486:40: note: expected 'void *' but argument is of type 'int'
 _CRTIMP __cdecl __MINGW_NOTHROW  void *realloc (void *, size_t);
                                        ^~~~~~~
In file included from main.c:2:0:
functions.c:26:10: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     *Tab = realloc(*Tab, taille * sizeof (*Tab));
          ^

谢谢!

realloc 的第一个参数是一个指针。 Tab 声明为 int *,这意味着 *Tabint,这就是它与参数类型不匹配的原因。这也意味着 return 类型与您分配给它的类型不匹配。

因此传递指针而不是它指向的内容。

Tab = realloc(Tab, taille * sizeof (*Tab));

但在接下来的几行中,另一个问题变得明显:

for (i = taille; i < index ; i--) {
    printf("\n - %d", Tab[i]);
}

数组的大小已调整为包含 taille 个元素,因此此循环读取已分配内存的末尾。您可能想要这个来代替分配:

Tab = realloc(Tab, index * sizeof (*Tab));

那么您不再读取过去分配的内存(假设数组的大小已调整为更大),但现在您正在读取未初始化的内存 值。