2017-04-07 9 views
0

私はCプログラミングの新人です 私はcharとintポインタを持つ構造体を持っていますが、私はこのポインタを頻繁に変更することにしましたfound some reference in online to realloc char *とそのうまく動作しますが、構造はRealloc char *内部構造

typedef struct MyStruct 
{ 
    int* intPtr; 
    char* strPtr; 
} Mystruct; 

私はポインタ内のchar *を再割り当て中にエラーが以下の見つけmain()

Mystruct *myStructPtr; 
myStructPtr = new Mystruct(); 
myStructPtr->intPtr = new int(); 
*myStructPtr->intPtr = 10; 

myStructPtr->strPtr = (char *)malloc(sizeof("original")); 
myStructPtr->strPtr = "original"; 
printf("String = %s, Address = %u\n", myStructPtr->strPtr, myStructPtr->strPtr); 

myStructPtr->strPtr = (char *)realloc(myStructPtr->strPtr, sizeof("modified original")); 
myStructPtr->strPtr = "modified original"; 
printf("String = %s, Address = %u\n", myStructPtr->strPtr, myStructPtr->strPtr); 

の内側に、問題が発生した意味

これは、ヒープが破損していることが原因である可能性があります。これは、読み込んだDLLのバグまたはいずれかのバグを示しています。

+2

これはCではありません。Cには 'new'というキーワードはありません。 –

+4

なぜCとC++を混在させるのですか? 'new'と' malloc'の両方!スティックでスティックする.. – Arash

+0

[The C++ FAQ](https://isocpp.org/wiki/faq/freestore-mgmt#mixing-malloc-and-delete) – Lundin

答えて

3

ここでの問題は、メモリ

myStructPtr->strPtr = (char *)malloc(sizeof("original")); 

を割り当てた後、あなたが返されたポインタ

myStructPtr->strPtr = "original"; 

を上書きしているし、その後、あなたがあるポインタにrealloc()を使用しようと、ありますメモリアロケータ関数によって返されません。これにより、undefined behaviorが発生します。

C11を引用し、章§7.22.3.5

ptrがヌルポインタである場合、realloc 関数は、指定されたサイズのためにmalloc関数のように振る舞います。それ以外の場合は、ptrがポインタと一致しない場合は、以前のメモリ 管理機能によって返された、またはスペースがfreeまたは realloc関数の呼び出しによって割り当て解除された場合、動作は未定義です。あなたはポインタ自体を印刷する%uを使用しないでください、と述べ [...]

は、%p書式指定子を使用して(void *)にTEH対応する引数をキャストyouust。あなたはどちらか

  • のmallocの後に()、に割り当てられたメモリ領域にコンテンツをコピーするstrcpy()を使用する必要があります

    ソリューションは、malloc()呼び出しから返されたポインタで指されます。

  • malloc()を取り除き、非標準strdup()を使用してください。
+0

応答@Sourav Ghoshに感謝します。ただし、strcpy()またはstrdup()を使用すると新しいアドレスが作成されます。 char *型に同じアドレスでサイズと値を再割り当てしたい。出来ますか?私はchar *アドレスがhttps://www.tutorialspoint.com/c_standard_library/c_function_realloc.htmでreallocを使用した後でも同じアドレスを維持できることを発見したためです。 –

+0

@ǨÅVËĔŊRǞĴŅ'strcpy() 'は決してすべてのアドレスを作成しません。 –

+0

'strcpy()'を使用している間、アセスメント違反エラー '保護されたメモリを読み書きしようとしました。これはしばしば他のメモリが壊れていることを示しています。 ' –

2

mallocはメモリを割り当て、そのアドレスをmyStructPtr-> strPtrに格納します。次に、ポインタを文字列定数 "オリジナル"の位置に再配置します。

文字列consantの場所を再割り当てすることはできません。

オリジナルにポインタを割り当てるのではなく、ポインタが指している場所にコピーする必要があります。

const char* originalStr = "original"; 
memcpy (myStructPtr->strPtr, originalStr , strlen(originalStr)+1); 
関連する問題