繁体   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