strcatを2回使用した後のヒープ破損

クリス

私がここでどんな骨頭の間違いをしているのか見当がつかないので、これは私をイライラさせています。

次のスニペット(これはより大きなメソッドからのテストスニペットであることに注意してください)では、基本的にSQLメソッドから取得した文字列をコピーしようとしています。次に、ユーザーがメソッドで追加の列数を指定した場合、区切り文字(この場合はセミコロン)と追加の文字列を追加します。

//...
char** pLocalArray;
char buff[512];
//... pLocalArray is allocated

// The semicolon is replaced by a variable passed into the function, but just putting this for simplicity
char delimeterStr[2] { ';', '\0' };

for (int uCol = 0; uCol < numCols; uCol++)
{
    if (uCol >= 1)
    {
        const char* test2 = "1704EB18-FE46-4AE4-A90F-06E42C3EE07A"; // Just a test GUID
        memcpy(buff, test2, 37); // Just testing some logic, copy the string into the buffer 

        strcat(pLocalArray[uRow], delimeterStr); // This works just fine if I stop here
        // strcat(pLocalArray[uRow], buff); // ***** If I uncomment out this line, it throws a heap exception

        std::cout << "Check 3 -- Output is: " << pLocalArray[uRow] << endl; // Output: MyFirstString|MySecondString|MyThirdString;1704EB18-FE46-4AE4-A90F-06E42C3EE07A
        std::memset(buff, '\0', sizeof(buff));
        std::cout << "Check 4 -- Output is: " << pLocalArray[uRow] << endl; //Sanity check - MyFirstString|MySecondString|MyThirdString;1704EB18-FE46-4AE4-A90F-06E42C3EE07A
    }
    else
    {
        const char* test = "MyFirstString|MySecondString|MyThirdString";
        memcpy(buff, test, 43);
        pLocalArray[uRow] = _strdup(buff);

        std::cout << "Check -- Output is: " << pLocalArray[uRow] << endl; // Output: MyFirstString|MySecondString|MyThirdString
        std::memset(buff, '\0', sizeof(buff));
        std::cout << "Check 2 -- Output is: " << pLocalArray[uRow] << endl; //Sanity check - Output: MyFirstString|MySecondString|MyThirdString
    }
}
//...

ただし、コメントからわかるように、2番目のstrcat呼び出しを使用すると例外がスローされます。strcat区切り文字でonを実行しても問題なく機能する理由がわかりませんが、区切り文字を追加してすぐにGUID文字列を追加しても機能しません。誰かが私が間違っていることや考慮していないことを私に指摘できますか?

エイドリアンモール

strdup関数がどのように機能するかを誤解している可能性があります次の行で:

    pLocalArray[uRow] = _strdup(buff);

これは、最初にメモリを割り当てるために呼び出されpLocalArray[uRow]ます。割り当てられるスペースの量は、buff文字列の実際の長さでありnul終了文字配列として解釈されます。これは"MyFirstString|MySecondString|MyThirdString"、指定されたbuff配列のサイズではなくリテラルの長さになります

後でそれに文字列を追加しようとすると、その後、あなたは(あなたが最初に割り当てられた領域をオーバーフローしているstrcatだけらしい仕事に、それはそれにもかかわらず、未定義の動作です)。

最大511文字(およびnul-terminator)のスペースを確保するには、次のようなコードが必要です。

    pLocalArray[uRow] = malloc(sizeof(buff)); // Allocate full size of "buff"
    strcpy(pLocalArray[uRow], buff); // then copy the strung data

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

動的配列を削除した後のヒープの破損

分類Dev

新しい文字の後のヒープ破損[strlen

分類Dev

印刷しようとしたときのヒープの破損

分類Dev

newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

分類Dev

ヒープの破損が検出されましたか?

分類Dev

ヒープの破損が検出されました| C

分類Dev

文字列を削除した後、C ++でヒープ破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

通常のブロック後にヒープの破損が検出されました(#181)

分類Dev

ヒープの破損が検出されました:通常のブロック後(#176)

分類Dev

通常のブロック #63 の後にヒープ破損が検出されました

分類Dev

検出されたヒープ破損:通常のブロック後()

分類Dev

c ++ delete [] 2D配列によりヒープが破損しました

分類Dev

破損したヒープをクリーンアップできますか?

分類Dev

ヒープ破損が検出されました-iPhone5Sのみ

分類Dev

2D動的配列を解放するときのヒープの破損

分類Dev

2D動的配列を解放するときのヒープの破損

分類Dev

LU分解のnxn行列を取得している間のヒープの破損

分類Dev

2つのLPTSTRでの作業中のヒープの破損

分類Dev

ヒープ破損が検出されましたMalloc()Free()

分類Dev

CreateWindowExWの使用中のヒープの破損

分類Dev

C#アプリでマーシャリングされた構造体を受け取った直後のヒープの破損

分類Dev

ヒープ破損の問題-C

分類Dev

削除を使用するとヒープが破損する

分類Dev

shared_ptrが破棄されたときのヒープの破損

分類Dev

System( "pause")はヒープ破損を引き起こします

分類Dev

ヒープの破損を引き起こすmalloc

分類Dev

c ++プログラムの実行時にヒープが破損しましたエラー

Related 関連記事

  1. 1

    動的配列を削除した後のヒープの破損

  2. 2

    新しい文字の後のヒープ破損[strlen

  3. 3

    印刷しようとしたときのヒープの破損

  4. 4

    newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

  5. 5

    ヒープの破損が検出されましたか?

  6. 6

    ヒープの破損が検出されました| C

  7. 7

    文字列を削除した後、C ++でヒープ破損が検出されました

  8. 8

    C ++:通常のブロック後にヒープの破損が検出されました

  9. 9

    C ++:通常のブロック後にヒープの破損が検出されました

  10. 10

    通常のブロック後にヒープの破損が検出されました(#181)

  11. 11

    ヒープの破損が検出されました:通常のブロック後(#176)

  12. 12

    通常のブロック #63 の後にヒープ破損が検出されました

  13. 13

    検出されたヒープ破損:通常のブロック後()

  14. 14

    c ++ delete [] 2D配列によりヒープが破損しました

  15. 15

    破損したヒープをクリーンアップできますか?

  16. 16

    ヒープ破損が検出されました-iPhone5Sのみ

  17. 17

    2D動的配列を解放するときのヒープの破損

  18. 18

    2D動的配列を解放するときのヒープの破損

  19. 19

    LU分解のnxn行列を取得している間のヒープの破損

  20. 20

    2つのLPTSTRでの作業中のヒープの破損

  21. 21

    ヒープ破損が検出されましたMalloc()Free()

  22. 22

    CreateWindowExWの使用中のヒープの破損

  23. 23

    C#アプリでマーシャリングされた構造体を受け取った直後のヒープの破損

  24. 24

    ヒープ破損の問題-C

  25. 25

    削除を使用するとヒープが破損する

  26. 26

    shared_ptrが破棄されたときのヒープの破損

  27. 27

    System( "pause")はヒープ破損を引き起こします

  28. 28

    ヒープの破損を引き起こすmalloc

  29. 29

    c ++プログラムの実行時にヒープが破損しましたエラー

ホットタグ

アーカイブ