[英]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.