如何将多个整数放入int*tab;在由0分隔的两个不同循环中,例如C中的VS 2019中的[1,1,1,0,1,1]



我正在为图灵机减法编写一个模拟器,首先,我需要将mn转换为1和0。例如,如果m = 3n = 2,则输出将是int阵列中的[1,1,1,0,1,1]

我尝试使用mallocint* tab分配内存,之后,我只需将第一个放在第一个循环中,然后附加一个0,然后在另一个循环中添加n1s。

我认为问题出在Visual Studio上,因为我在vim中尝试了相同的代码,结果是正确的。在VS中,1的输出是正确的,但我得到的不是0,而是一些随机负数。

这是代码:

scanf_s("%d", &m);
printf("n = ");
scanf_s("%d", &n);
int* tab = malloc(sizeof(int) * (n + m + 1));
int i;
for (i = 0; i < m; i++)
{
tab[i] = 1;
}
tab[i + 1] = 0;
int j = 0;
for (j = i + 1; j < n + i + 1; j++)
{
tab[j] = 1;
}
for (int k = 0; k < n + m + 1; k++)
{
printf("%d", tab[k]);
}

VS 的错误输出

我相信

tab[i + 1] = 0;

就是问题所在。根据increment语句,从先前的循环执行来看,只有当i<m为假时,即对于i == m的情况,控制才会出来。

现在,您希望将0放在这个索引中,而不是放在index + 1中。

更改为tab[i] = 0;

现在,负数的可能原因是:malloc()返回的内存位置的内容是不确定的,所以如果您在i == m时错过了写入索引(您从0写入m-1,然后从m+1写入m+n-1(,在读取时,它将返回不确定的值。

问题出现在tab[i + 1] = 0;行中。当前面的循环结束时,则i等于m——也就是说,i的值将ready为"0";一个在末端之外";。

所以,只要把它改为:tab[i] = 0;,你就应该没事了。

最新更新