簡體   English   中英

運行時檢查失敗 #2 - 變量“newRow”周圍的堆棧已損壞

[英]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 newRowmakeRow() function 的局部變量。 請注意,本地(自動)非靜態變量的生命周期僅限於其 scope 即聲明它的塊。 任何在其生命周期之外訪問它的嘗試都會導致未定義的行為。

你可以做幾件事來修復它:
創建numRow數組static或將numRow聲明為char *類型並動態分配 memory 給它,在這種情況下,確保在完成后free它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM