[英]Run-Time Check Failure #2 - Stack around the variable 'IDNumber' was corrupted
[英]Run-Time Check Failure #2 - Stack around the variable 'newRow' was corrupted
我仍然收到關於如何使用strncat()
嘗試圍繞newRow
的堆棧的錯誤,以便我可以說出添加到字符串中的新章程的數量,但最后我仍然在newRow
周圍有損壞。
就傳遞給這個 function 的變量而言,我認為它們非常簡單。 我還使用sizeOfString
作為定制的 function,因為我不允許使用sizeof
的標准尺寸。
char* makeRow(char elementOne[20], int elementNumber, int numCycles, int orginalData[40], float ctValues[7]){
char newRow[] = "";
int lookingAt;
int dataPoint;
char* elementPtr;
int charArrSize;
elementNumber = elementNumber--;
elementPtr = elementOne;
int lenOfElemnt = *(&elementOne + 1) - elementOne;
//charArrSize = sizeOfString(elementPtr);
charArrSize = sizeOfString(elementOne);
strncat(newRow, elementOne, charArrSize);
//strcpy(csvThirdRow, (",%s", elementOne));
for (int i = 1; i <= 5; i++)
{
lookingAt = (((i - 1) * 5) + 1 - 1);
int maxLookingAt = numCycles * 5;
dataPoint = orginalData[lookingAt];
char dataPointBuffer[100];
if (lookingAt < maxLookingAt)
{
sprintf(dataPointBuffer, ",%d", dataPoint);
charArrSize = sizeOfString(dataPointBuffer);
strncat(newRow, dataPointBuffer, charArrSize);
}
else
{
strncat(newRow, ",",1);
}
}
char ctBuffer[20];
float ctNumber = ctValues[elementNumber];
sprintf(ctBuffer, ",%.2f\n", ctNumber);
charArrSize = sizeOfString(ctBuffer);
strncat(newRow, ctBuffer, charArrSize);
return newRow;
}
如果我們省略數組維度,編譯器會根據初始化器的大小為我們計算它。
所以這
char newRow[] = "";
和這個一樣
char newRow[1] = "";
newRow
數組的大小為1
。
您試圖將超過1
字符復制到newRow
數組,這會導致未定義的行為並導致損壞。
從strncat() :
如果目標數組沒有足夠的空間容納 src 的 dest 和第一個 count 字符的內容,以及終止 null 字符,則行為未定義。
您是否應該嘗試為newRow
數組提供足夠的大小,就像這樣
char newRow[1024] = {0};
您的代碼中還有另一個問題 -
您正在從makeRow()
function 返回newRow
。 newRow
是makeRow()
function 的局部變量。 請注意,本地(自動)非靜態變量的生命周期僅限於其 scope 即聲明它的塊。 任何在其生命周期之外訪問它的嘗試都會導致未定義的行為。
你可以做幾件事來修復它:
創建numRow
數組static
或將numRow
聲明為char *
類型並動態分配 memory 給它,在這種情況下,確保在完成后free
它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.