Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question sur realloc

67 réponses
Avatar
Kevin Denis
Bonjour,

j'ai une question sur realloc:
$ cat testrealloc.c
#include <stdio.h>
#include <stdlib.h>

int main(void){
char * c=NULL;
c=malloc(8);
if (c == NULL) return -1;
c="abcdefgh";
printf("valeur du pointeur: %d\r\n",c);
printf("valeur de c: %s\r\n",c);
c=realloc(c,16);
return 0;
}
$ gcc -Wall -o testrealloc testrealloc.c
testrealloc.c: In function 'main':
testrealloc.c:9: attention : format '%d' expects type 'int', but argument 2
has type 'char *'
$ ./testrealloc
valeur du pointeur: 134514000
valeur de c: abcdefgh
Erreur de segmentation

Ma question est: pourquoi le realloc segfaulte?
Merci
--
Kevin

7 réponses

3 4 5 6 7
Avatar
espie
In article ,
Pierre Maurette wrote:
Lucas Levrel, le 5/7/2011 a écrit :

[...]

char *s="coucou";



Et pourquoi ce ne serait pas mieux d'écrire:

char* s = "coucou";




Parce qu'on est dans fr.comp.lang.c, pas fr.comp.lang.c++

;)
Avatar
espie
In article ,
Pierre Maurette wrote:
Si je compile:

int i = 0;

quel est le statut et la valeur de &i lors de la compilation ?



Ca depend s'il y a &i ou non dans ton code...
Avatar
espie
In article ,
Pascal J. Bourguignon wrote:
(Marc Espie) writes:

In article ,
Pierre Maurette wrote:
Lucas Levrel, le 5/7/2011 a écrit :

[...]

char *s="coucou";



Et pourquoi ce ne serait pas mieux d'écrire:

char* s = "coucou";




Parce qu'on est dans fr.comp.lang.c, pas fr.comp.lang.c++



Ce n'est pas la bonne raison, car c'est pareil en C++.



Visiblement, tu as encore quelques soucis avec la culture locale. Tu veux
quelques parentheses pour te detendre ? ((((:)))))

La facon de declarer les pointeurs est un des petits trucs qui permet
de differencier simplement les programmeurs habitues aux style C traditionnels
de ceux qui pratiquent le C++.
Avatar
Alexandre Bacquart
On 05/07/2011 10:03 PM, Lucas Levrel wrote:
Le 7 mai 2011, Pierre Maurette a écrit :

const char* s = "coucou";



Oui. J'ai perdu du temps avec ce bordel. s est un /char étoile/ non
modifiable. En fait un pointeur sur une chaîne en dur. Un littéral
chaîne.
Le littéral chaîne n'existe que pendant les instants de la compilation.



Peux-tu expliciter ? La chaîne en question est encore dans l'exécutable.



Mon petit doigt me dit qu'il faut dire tableau dans ce contexte :)


--
Alex
Avatar
Erwan David
de manière plus pratique ça permet d'éviter les erreurs du genre

char* s,t;

alors qu'on voulait en fait écrire

char *s,*t;


--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Pascal J. Bourguignon
Erwan David writes:

de manière plus pratique ça permet d'éviter les erreurs du genre

char* s,t;

alors qu'on voulait en fait écrire

char *s,*t;



Ce n'est pas pratique. Relis mon message.

--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Antoine Leca
Tonton Th écrivit :
On 05/07/2011 08:45 PM, Pierre Maurette wrote:

Le littéral chaîne n'existe que pendant les instants de la compilation.



Si il n'est plus là au run, à quoi sert le const char * ?



À qualifier l'objet initialisé. Qui est différent du texte qui est
utilisé pour l'initialiser.

C'est pareil pour
const double e = 3.14159265;
Après la compilation, les chiffres du littéral flottant ne servent à rien.


Antoine
3 4 5 6 7