15 votes

Différence entre malloc et realloc ?

Supposons que j'ai deux exemples de code pour créer un tableau d'entiers de 10 éléments :

int *pi = (int*)0; 
realloc(pi,10);

et l'autre est celle qui est écrite normalement, c'est-à-dire :

int *pi;
pi= malloc(10*sizeof(int));

Maintenant, ma question est la suivante : le premier type d'affectation est légal mais n'est pas utilisé. Pourquoi, alors que je peux y obtenir le lieu de départ de mon choix ?
L'initialisation des pointeurs avec des constantes est légale mais non utilisée. Pourquoi ?

30voto

Corbin Points 17420

Quand NULL est adoptée, realloc est équivalent à malloc . Le site NULL peut être utile si vous allouez dans une sorte de boucle et que vous ne voulez pas avoir un cas spécial la première fois que vous allouez.


Pendant que nous y sommes, les façons assez standard d'utiliser malloc et realloc sont :

int* p;
p = malloc(10 * sizeof(int)); //Note that there's no cast
//(also, it could just be int* p = malloc(...);)

int* np = realloc(p, 15 * sizeof(int));
//Note that you keep the old pointer -- this is in case the realloc fails

En guise d'aparté, l'histoire est la principale raison pour laquelle vous voyez les déclarations et les affectations sur des lignes différentes. Dans les anciennes versions du C, les déclarations devaient être placées en premier dans les fonctions. Cela signifiait que même si votre fonction n'utilisait pas une variable avant 20 lignes, vous deviez la déclarer en premier.

Comme vous ne savez généralement pas quelle doit être la valeur d'une variable qui n'est pas utilisée pendant 20 lignes, vous ne pouvez pas toujours l'initialiser à quelque chose de significatif, et vous vous retrouvez donc avec une déclaration et aucune affectation au début de votre fonction.

En C99/C11, il n'est pas nécessaire de déclarer les variables en haut des scopes. En fait, il est généralement suggéré de définir les variables aussi près que possible de leur utilisation.

10voto

ouah Points 75311

Le C exige que le pointeur passé à realloc doit être un pointeur obtenu à partir de malloc , calloc o realloc (ou un pointeur nul).

4voto

mah Points 21457

La première mission est pas légal, car le pointeur que vous passez dans realloc() doit vous avoir été donné précédemment par le biais d'une allocation quelconque. (De plus, vous ignorez sa valeur de retour, ce que vous ne devez jamais faire avec les allocations).

malloc() est de créer un tampon pour quelque chose, d'une taille fixe. realloc() est de rendre un tampon et d'en obtenir un autre d'une taille (vraisemblablement) différente - et il pourrait vous rendre le même tampon que vous utilisiez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X