2017-07-12 1 views
0

アプリケーションをデバッグするとき、私は100%確信している構造体が4つの文字列で構成されていることをメモリ内で検出しました。私はそれをデータ構造に変換する方法はよく分かりませんが、構造体のポインタアドレスを使って値にアクセスできます。例えば、ここに(例は、それが一貫してメモリアドレスは0x123456に配置されて言うことができますよう)のデータ構造体をメモリにどのように見えるか4つの別個の文字列C++メモリをデータ構造体に変換する

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

enter image description here

データstructureconsistsであると私は持っています

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

のようなデータ構造体を作成しようと、私はデータ

reversedConnectionDat_t * storeDat = (reversedConnectionDat_t*)0x123456; 
print(storeDat->data3); 
にアクセスしようとしたか、これはあります

しかし、うまくいかないようです。私はメモリから文字列を正しく読み込んでいませんか?

(ああと文字列が時々すなわち、時々、文字列1の長さと文字列3に7になり、私は上記の投稿のコード例に掲示するものから変更されますのみの長さなどで2になります...)

+0

メモリにはポインタが含まれていないので、構造体もそうではありません。プレーンchar配列を使用します。パディングとアラインメントを無効にしてください... – Thomas

+0

彼らは私に文字列のようには見えませんが、どういうことが彼らのものだと思いますか? – harold

+0

@harold私は彼らが渡されている機能を知っています。この関数は4つのパラメータをとり、4つすべてが文字列です。 – reflexdev

答えて

0

ポインタ(char*)を使用しており、構造体の構造体サイズは4つのポインタのサイズです。文字列を取得する場合は、固定サイズの配列(char[])を使用する必要があります。

これは、文字列サイズがバッファサイズと等しい場合にのみ機能します。

IMO文字列を取得し、ヌルターミネーターを見つけて /0とし、各文字列の先頭(最初の3つのヌルターミネーターの後ろ)を指すようにポインターを構成します。

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

これは、ポインタの構造を動作させる方法です。このコードは最適ではないので、それをそのまま使うべきではありませんが、メモリからどのように文字列を取得できるかを示しています。 C文字列を取得するには、最初の文字のアドレスと最後にヌルターミネータが必要です。

+0

タイプミスがあります。ヌル文字は ''/ 0' 'と書かれていますが、' '\ 0'''と書かれています。 – WhiteSword

+0

@ManjinderSinghHanjraありがとう、ありがとう。 –

+0

*これは、文字列のサイズがバッファサイズと等しい場合にのみ機能します。*間違っています。文字列は0で終了するので、文字列の長さがバッファサイズを超えない限り、 'char []'は機能します。 –

2

ポインタの構造体へのポインタがあるため、正しいメモリアドレスに構造体を指定しても構造体内にまだ初期化されていないポインタがあります。それらに実際のメモリを提供する必要があります。私はこのようなあなたの構造を設定しようとします...

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

私はスペースを数えませんでした。私はちょうどそれのことを推測していますが、あなたはその考えを得る。

+0

問題は、文字列が一貫したサイズではないということです。私。それらはときどき変更されるので、私は上記の例のコードに書かれているものとは限りません – reflexdev

+0

@reflexdev:char配列を文字列ができる最大サイズ*にします。たとえば、最初の文字列が常に1文字または2文字にヌルターミネータを加えた場合、答えに示すように、最初の配列の長さを3にします。データには、0で終了する文字列を持ついくつかの最大長バッファがあるようです。そうであれば、この答えは正しいものです( 'data2'、' data3'などの正しいバッファサイズを指定すれば)。 –

0

magicnumber:0x123456、あなたの構造に合わないかもしれないキャスティングを除いて、あなたのコードに何が問題なのか理解できませんでした。 magic-numberは、あなたが定義した構造体とデータの互換性があると確信していますか?同様に、storeDat->data3にアクセスしようとすると、次のようなことをするか、非常に運が良ければ、seg-faultにつながるはずです。

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. - 私は良いプログラマーではない。しかし、私はそれがいくつかの助けになるかもしれないと思ったように、ちょうど不思議で答えた。申し訳ありませんが、あなたの問題を正しく理解できなかった場合。

1

あなたはそのデータ構造を誤って識別したと思います。私はあなたが持っているものは3つの独立したバッファであると考えています。それぞれは1つ以上のヌル終了文字列を保持できます。

最初の構造は68バイト長で、"ad\0dgdhkkkkkkhkk\0"(バッファを満たすのに十分な\0が続くが含まれています。

このバッファは本当に唯一の64バイト長であり、それがために使用されている4バイトの後ということも可能です他のいくつかのデータ要素が。

第2のバッファは、64のバイトを記入する\0文字を単一の文字列とパディングを含む、64バイト長になりそうだ。

第3のバッファがどのくらい言うことは不可能です。私たちが知っていることは、それが文字列を保持するのに十分な長さ。"dgcfoh\0"。私はと思いますバッファは64バイト長ですが、私はより多くのデータを取得した場合は、その意見を修正して喜んで。

私はあなたが欲しいの構造があると思う:あなたが私たちに与えてくれた乏しい情報に基づいて

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

、それは私が開始したいものです。次に、ヌルで終了する文字列のバッファを解析する方法が必要です。つまり、最初のバッファから2つの個別の文字列を取得します。これはかなり簡単なCコードです。

関連する問題