调试器没有错误或警告,但是内存清理程序显示“未初始化的访问”,每行输出一个。
输出很好,除非我改变了大小甚至注释掉了一个我什至无法访问的数组(char ArrayThatINeverEvenUsed [10000]),否则输出是意外的。未初始化的访问错误会同时出现在正确/预期的版本和错误的版本中。
#include <stdio.h>
int main()
{
FILE *fptr;
fptr = fopen("ID_List29.csv", "wb");
// why does this program only work if there's an UNUSED array of size ~100000 or larger
char ArrayThatINeverEvenUsed[10000]; // why does removing zeros cause different outputs?
int i , j, k , m;
int sz = 0;
char c, d, e, f;
char tStr[8];
tStr[4] = 0x7C; // pipe separator
tStr[5] = 0x7C;
tStr[6] = 0x0D;
tStr[7] = 0x0A;
for(i = 65; i < 91; i++)
{
c = i;
tStr[0] = c;
for(j = 65; j <91; j++)
{
d = j;
tStr[1] = j;
for(k = 65; k <91; k++)
{
e = k;
tStr[2] = k;
for(m = 65; m <91; m++)
{
f = m;
tStr[3] = m;
fprintf(fptr, "%s", &tStr[0]);
}
}
}
}
puts("Exiting...");
return 0;
}
答案 0 :(得分:5)
空终止您的字符串。
char tStr[9]
tStr[8]=0;
否则,您的代码会偶然起作用。
代码工作的原因与未使用的数组增加堆栈并将tStr
放置在新分配的页面上,从而将其初始化为零有关,但是这里还有其他问题。无论如何,都会有很多不确定的行为发生。