我正在为图灵机减法编写一个模拟器,首先,我需要将m
和n
转换为1和0。例如,如果m = 3
、n = 2
,则输出将是int
阵列中的[1,1,1,0,1,1]
。
我尝试使用malloc
为int* tab
分配内存,之后,我只需将第一个放在第一个循环中,然后附加一个0,然后在另一个循环中添加n
1s。
我认为问题出在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;
,你就应该没事了。