重新分配一个指针,在哪里说“它是一个指针”?
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 *
,这意味着 *Tab
是 int
,这就是它与参数类型不匹配的原因。这也意味着 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));
那么您不再读取过去分配的内存(假设数组的大小已调整为更大),但现在您正在读取未初始化的内存
值。
我在使用 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 *
,这意味着 *Tab
是 int
,这就是它与参数类型不匹配的原因。这也意味着 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));
那么您不再读取过去分配的内存(假设数组的大小已调整为更大),但现在您正在读取未初始化的内存 值。