私がここでどんな骨頭の間違いをしているのか見当がつかないので、これは私をイライラさせています。
次のスニペット(これはより大きなメソッドからのテストスニペットであることに注意してください)では、基本的に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]
コメントを追加