Pointeur cpp

Résolu/Fermé
JohnR - Modifié le 31 déc. 2018 à 18:44
 JohnR - 4 janv. 2019 à 19:19
Bonjour ça va peut-être vous senblez ridicul, mais je bute sur un problème, je reprend le c++ après un long arrêt est je chercher à modifier le contenu d'un pointeur :


int mafct( char * ip4 ){
 
 ....
 if( ( retV = GetAdaptersInfo( pai, &( outl = sizeof( IP_ADAPTER_INFO ) ) ) ) == NO_ERROR ){
  
  // Ethernet
  lpai = pai;
  if( lpai->Type == ETHERNET ){
  
   memcpy( 
    ip4, 
    lpai->IpAddressList.IpAddress.String,
    iplen
   );
  }
  
 }
}

int main( int argc, char ** argv[] ){


  ....
  ....
  char * ip4;


  ...
  ...
  ip4 = (char * )malloc( 16 );
  memset( ip4, 0, 16 );
  mafct( ip4 );   -- > segmentation fault

}



si j'essaie avec memcpy ou strncpy et mm !! strcpy j'ai une segmentation fault pourtant si je fait :

cela fonctionne si je passe un doule pointeur char ** ip4 mais :


int mafct( char * ip4 ){
 
 ....
 if( ( retV = GetAdaptersInfo( pai, &( outl = sizeof( IP_ADAPTER_INFO ) ) ) ) == NO_ERROR ){
  
  // Ethernet
  lpai = pai;
  if( lpai->Type == ETHERNET ){
  
   memcpy( 
    ip4, 
    lpai->IpAddressList.IpAddress.String,
    iplen
   );
   int i = 0;
   while( lpai->IpAddressList.IpAddress.String[i] != *"\0" ){
    *(ip4++) = lpai->IpAddressList.IpAddress.String[i];
    i++;   
   }
  }
  
 }
}

int main( int argc, char ** argv[] ){


  ....
  ....
  char * ip4;


  ...
  ...
  ip4 = (char * )malloc( 16 );
  memset( ip4, 0, 16 );
  mafct( ip4 );   
  printf("%s", ip4); -- OK
  free( ip4 );

}



Quelque chose m'échappe et je commence à m'embrouiller l'esprit, et à en perdre mon cpp ^^.

je ne comprend pas puisque tout est ok :

void strcpyy( char * a, char * b ){
  
 do{
  printf("%c", *(b) );
  
 }while( ( *a++ = *b++ ) != *"\0" );
 printf("\r\n");
}

int main( int argc, char ** argv ){

 printf("==================================\r\n" );
 char buffer[255];
 strcpyy( buffer, (char * )"looool" );
 
 printf("Value of bufer = %s ", buffer );  --> OK
 
 printf("==================================\r\n" );

 char * buff;
 buff = (char * ) malloc( 255 ); 
 memset( buff, 0, 255 );
 strcpyy( buff, (char * )"looool" );
 
 printf("Value of bufer = %s \r\n", buff ); -- > OK
 free( buff );
 
 printf("Value of bufer = %s \r\n", buff );

}



j'aimerais beaucoup utiliser les fonctions memcpy ou strnpy et pas être oliger de bidouiller une boucle en plein milieu comme ça, le code doit être clean est utiliser un maximum API sans devoir écrire des fonction de base.
Merci est bonne année à tous !
Configuration: Linux / Firefox 60.0
A voir également:

2 réponses

Bonjour

Je ne connais pas grand chose en C++, mais de quel type est lpai->IpAddressList.IpAddress.String ?
Si c'est un string comme son nom le suggère, ce n'est donc pas un char * et normal que memcpy et strncpy ne fonctionnent pas.
Mais tu peux le faire avec la méthode copy : http://www.cplusplus.com/reference/string/string/copy/. Attention au '\0' final.
1
écoute, éffectivement selon MSDN :

IP_ADPATER_INFO


IpAddressList est un pointeur vers IP_ADDR_STRING ou IpAddress est bien de type String IP_ADDRESS_STRING.

la structure IP_ADDRESS_STRING


typedef struct {
char *String[4 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;


est un char *String[4 4] ?

que vux dire cette annotation [4 4] ?

	printf("%i, %c, %08x",
		sizeof(lpai->IpAddressList.IpAddress.String),
		*(&lpai->IpAddressList.IpAddress.String),
		&lpai->IpAddressList.IpAddress.String
	);

	16, 1, 0x0023....
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 2 janv. 2019 à 15:20
Salut JohnR,

Si tu te sers de la struct IP_ADAPTER_INFO

https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-_ip_adapter_info

celle-ci contient des membres ayant le type IP_ADDR_STRING et non pas IP_ADDRESS_STRING (qui est une autre struct).

Selon la doc pour IP_ADDR_STRING, qui est à https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-_ip_addr_string

The String member is a char array of size 16. This array holds an IPv4 address in dotted decimal notation.


C'est à dire un bête char[16], qui sert à stocker sous forme de chaîne C terminée par
'\0'
une adresse IPv4 sous forme
xxx.xxx.xxx.xxx
(15 caractères + la fin de chaîne).

Vu que c'est une chaîne C, tu peux la copier avec strcpy ou strncpy (et, d'ailleurs, déclarer par la même occasion ip4 dans ton main comme un
char ip4[16] = { '\0' };
et retirer ton malloc et ton memset), et l'afficher avec un simple
printf
et le spécificateur
%s
(comme dans l'exemple présenté à la suite de la doc de IP_ADAPTER_INFO).

Ton memcpy devrait aussi marcher, si iplen vaut 16.

Sinon, je trouve ton code bien compliqué, et par ailleurs tu ne devrais pas faire
 != *"\0"
pour contrôler la présence du caractère terminateur, mais
 != '\0'
pour comparer un char au caractère
'\0'
.

Dal
1
Bonjour Dal excuse moi de cette réponse tardive, j'ai du travailler sur un autre project non personnel.

- Si tu as uen manière plus rapide de récuprérer l'addresse IP d'une carte ethernet sans passer par GetAdapterInfo je suis prenneur tout de suite :p ( c'est la seule mannière que j'ai trouvé avec MSDN est mes connaissances )

- Et effectivement je me suis aperçus que c'étais un char 16, c'été indiquer sur MSDN dans la description , je ne comprenais pas l'annotation du char[4 4] peut-être 4x4 XD, en assembleur c beaucoup plus simple je trouve.

et j'en sui arriver à la même conculsion que toi, mais comme Firefox a crashé et à perdu ma session je ne peu plus le mettre en Résolu, je suis tomber sur le lien par hasard.

- Alors pour ça != *"\0" je suis tout a fait d'accord avec toi mes mon compilateur ( g++ ) refuse cette annotation.

Qu'est ce que tu trouve complqué ? mon code ce n'est pas les 3 codes que j'ai mis a la suite, se sont juste des exemples pour illustré mon problème.

le code il est la :

https://github.com/devGnode/Reverse_shell/blob/master/bind_reverse_cpp_v2/main.cpp

Je te remercie d'avoir prit de ton temps pour me répondre.
0