[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [linux] [devel] Petit soucis avec C.




Le 30/06/2001 à 16:45 CHARLIER Philippe a écrit :

>Bonjour a tous,
>
>Je suis toujours en train d'essayer de comprendre le C (sous Linux 
>off-course).  J'ai quelques soucis avec les pointeurs :-).
>
>J'ai ecrit le pgm suivant, pour un peu voir comment cela fonctionne :
>
>----------------------------------------------------
>#include <stdio.h>
>
>int main (int argc, char **argv)
>{
>	char **p_char;
>	char *pointeur;
>	int i;
>		
>	*p_char = "Bonjour";
>	*(p_char + 1) = "Hello";
>	*(p_char + 2) = "Goeiedag";
>	
>	for ( i=0; i <= 2; i++)
>	{
>		pointeur = *(p_char + i);
>		
>		printf("Affichage de *(pchar+%d) : %s.\n", i, pointeur );
>	}
>	
>	printf("test.\n");
>	
>	return 0;
>}
>----------------------------------------------------
>
>Le programme une fois execute me sort ceci :
>
>Affichage de *(pchar+0) : Bonjour.
>Affichage de *(pchar+1) : Hello.
>Affichage de *(pchar+2) : Goeiedag.
>test.
>Abandon
>
>???????? D'ou vient ce "Abandon" ???????

Bonjour,


Ce programme n'est vraiment pas terrible 
mauvaise utilisation des pointeurs

>	*p_char = "Bonjour";
>	*(p_char + 1) = "Hello";
>	*(p_char + 2) = "Goeiedag";
tu ne peux pas faire ça
tu remplis la mémoire sans avoir allouer de la place 
tu n'as alloué que de la place que pour un pointeur *p_char
mais rien pour le reste du tableau de pointeur.

ceci provoque une corruption d'adresse mémoire
ce qui fait que ton process plante avec un SIGABRT d'où le "Abandon"
regarde avec un debugger :

24      }
(gdb) 
0x400410de in __libc_start_main () from /lib/libc.so.6
(gdb) 
Single stepping until exit from function __libc_start_main, 
which has no line number information.

Program received signal SIGABRT, Aborted.
0x40051d11 in kill () from /lib/libc.so.6
(gdb) backtrace
#0  0x40051d11 in kill () from /lib/libc.so.6
#1  0x40051b15 in raise () from /lib/libc.so.6
#2  0x40053143 in abort () from /lib/libc.so.6
#3  0x40136038 in __deregister_frame_info () from /lib/libc.so.6

@++
nico



[ Soyez précis dans vos sujets svp afin de déterminer directement  ]
[ le type de demande...                                            ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php     ]
[ http://LinuxBe.org              Contact: listmaster@linuxbe.org  ]