2017-07-12 1 views
0

Lors du débogage d'une application, j'ai trouvé en mémoire une structure dont je suis sûr à 100% que se compose de 4 chaînes. Bien que je ne sois pas tout à fait sûr comment je le convertirais en une structure de données ainsi je peux employer l'adresse de pointeur de structures pour accéder aux valeurs. Par exemple ici, est ce que la structure de données ressemble en mémoire (comme un exemple permet de dire qu'il est toujours situé à l'adresse de mémoire 0x123456) enter image description hereC++ convertir la mémoire en structure de données

Les données structureconsists de 4 cordes séparées

string 1 = ad 
string 2 = dgdhkkkkkkhkk 
string 3 = ggghhjk 
string 4 = dgcfoh 

Et j'ai a essayé de créer une structure de données comme

struct reversedConnectionDat_t 
{ 
    char * data1; 
    char * data2; 
    char * data3; 
    char * data4; 
} 

et voici comment j'ai essayé d'accéder aux données

reversedConnectionDat_t * storeDat = (reversedConnectionDat_t*)0x123456; 
print(storeDat->data3); 

Mais cela ne semble pas fonctionner. Est-ce que je ne lis pas correctement les chaînes de la mémoire?

(Oh, et les cordes changent parfois de ce que je poste dans le code exemple affiché ci-dessus, soit parfois chaîne 1 sera 7 en longueur et chaîne 3 ne sera 2 longueur etc ...)

+0

La mémoire ne contient pas de pointeurs, donc votre structure ne devrait pas non plus. Utilisez des tableaux de char simple. Et désactiver le remplissage et l'alignement ... – Thomas

+0

Ils ne me ressemblent pas, comment êtes-vous sûr que c'est ce qu'ils sont? – harold

+0

@harold Je connais la fonction à laquelle ils sont passés. La fonction prend 4 paramètres, et tous les 4 sont des chaînes. – reflexdev

Répondre

0

Vous utilisez des pointeurs (char*) et la taille de la structure de votre structure est la taille des 4 pointeurs. Si vous voulez obtenir les chaînes, vous devez utiliser des tableaux (char[]) de taille fixe.

Cela fonctionnera uniquement si la taille de votre chaîne est égale à la taille de la mémoire tampon.

OMI, la meilleure façon est d'obtenir le dans un tableau de caractères puis trouver les terminateurs null /0 puis configurez vos pointeurs pour pointer vers le début de chaque chaîne (au début et à droite après les 3 premiers terminateurs nuls).

char* pointerToMem = something; //your strings data 
yourStruct.str1 = pointerToMem; 
while(*pointerToMem != '\0') 
{ 
    pointerToMem++; 
} 
yourStruct.str2 = pointerToMem + 1; 

Voici comment vous pouvez faire fonctionner la structure des pointeurs. Ce code n'est pas optimal et vous ne devriez pas l'utiliser comme cela, mais il montre comment vous pouvez obtenir les chaînes de la mémoire. Pour avoir une chaîne C, vous n'avez besoin que de l'adresse du premier caractère et du terminateur null à la fin.

+0

il y a une faute de frappe, vous avez écrit un caractère nul comme ''/ 0'' alors que ce devrait être' '\ 0'' – WhiteSword

+0

@ManjinderSinghHanjra Ouais, merci. –

+0

* Cela ne fonctionnera que si la taille de votre chaîne est égale à la taille de la mémoire tampon. * Ceci est incorrect. Les chaînes sont terminées par 0, donc tant que la longueur de la chaîne ne dépasse pas la taille de la mémoire tampon, le 'char []' fonctionnera. –

2

Vous avez un pointeur vers une structure de pointeurs, même si vous pointez la structure vers l'adresse de mémoire correcte, vous avez toujours des pointeurs non initialisés dans la structure. Vous devez leur fournir de la mémoire réelle. Je voudrais essayer de mettre en place votre structure comme ceci ...

struct reversedConnectionDat_t 
{ 
    char data1 [3]; 
    char data2 [50]; 
    char data3 [50]; 
    char data4 [50]; 
} 

BTW, je n'ai pas compté les espaces. Je l'ai juste deviné, mais vous avez l'idée.

+0

Le problème est que les chaînes n'ont pas une taille cohérente. C'est à dire. ils vont parfois changer donc ils ne sont pas toujours ce que j'ai mis dans l'exemple de code ci-dessus – reflexdev

+0

@reflexdev: Vous faites des tableaux de char la * taille maximale * que les chaînes peuvent être. Par exemple, si votre première chaîne contient toujours un ou deux caractères, plus le séparateur nul, vous devez créer la première longueur de tableau 3, comme indiqué dans la réponse. Il semble que les données sont plusieurs tampons de longueur maximale avec des chaînes à 0 terminaison. Si c'est le cas, alors cette réponse est la bonne (à condition de donner les tailles de buffer correctes pour 'data2',' data3', etc.). –

0

Je ne pouvais pas comprendre ce qui ne va pas avec votre code à l'exception de votre magicnumber:0x123456, la diffusion qui pourrait ne pas convenir à votre structure. E tes-vous sûr que votre magic-number donne des résultats compatibles avec la structure que vous avez définie? Comme, si vous essayez d'accéder à storeDat->data3, il va certainement conduire à seg-faute, sauf que vous faites quelque chose comme suit ou vous êtes très chanceux.

struct R{ 
    char *a; 
    char *b; 
}; 

int main(void) 
{ 
    struct R *r1 = (struct R*) malloc(sizeof(struct R)); 
    r1->a = "12333";  //Pointing to a string literal 
    r1->b = "12331";  //Pointing to a string literal 

    int address = (int)&r1; 
    struct R *r2 = (struct R*) address; 
    std::cout<<r2->b; 
    return 0; 
} 

P.S. - Je ne suis pas un bon programmeur. Mais j'étais simplement curieux de répondre, car je pensais que cela pourrait être utile. Désolé, si je ne pouvais pas comprendre votre problème correctement.

1

Je pense que vous avez mal identifié cette structure de données. Je soupçonne que vous avez trois tampons indépendants, chacun pouvant contenir une ou plusieurs chaînes à terminaison nulle.

La première structure est de 68 octets et contient "ad\0dgdhkkkkkkhkk\0" (suivi assez \0 pour remplir le tampon.

Il est possible que ce tampon est vraiment seulement 64 octets, et que les quatre octets après sont utilisés pour un autre élément de données.

le deuxième tampon semble être 64 octets, contenant une seule chaîne et rembourré avec \0 caractères pour remplir les 64 octets.

Il est impossible de dire combien de temps le troisième tampon est. Tout ce que nous savons, c'est que c'est assez longtemps pour contenir la chaîne "dgcfoh\0". Je devrais deviner que le tampon est long de 64 octets, mais être disposé à réviser cette opinion si j'obtiens plus de données.

Je pense que la structure que vous voulez est:

struct s 
{ 
    char data1[68]; // buffer holds one or more null-terminated strings 
    char data2[64]; 
    char data3[64]. 
} 

Basé sur le peu d'informations que vous nous avez donné, c'est ce que je commence par. Ensuite, vous avez besoin d'un moyen d'analyser un tampon de chaînes terminées par null. C'est-à-dire, obtenir les deux chaînes individuelles du premier tampon. C'est un peu facile de code C.