Pointeur cpp
Résolu
JohnR
-
JohnR -
JohnR -
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 :
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 :
Quelque chose m'échappe et je commence à m'embrouiller l'esprit, et à en perdre mon cpp ^^.
je ne comprend pas puisque tout est ok :
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 !
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:
- Pointeur cpp
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Dev cpp - Télécharger - Langages
- Le pointeur de mon pc portable ne marche plus - Guide
- Modulo cpp ✓ - Forum C++
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.
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.
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
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
Ton memcpy devrait aussi marcher, si iplen vaut 16.
Sinon, je trouve ton code bien compliqué, et par ailleurs tu ne devrais pas faire
Dal
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
printfet 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
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.
- 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.
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
est un char *String[4 4] ?
que vux dire cette annotation [4 4] ?