【发布时间】:2020-01-14 21:25:36
【问题描述】:
我刚开始使用 C,我正在尝试创建一个程序,该程序接受一个数字并使用这种方法将其转换为二进制(来自 indepth.dev):
要将整数转换为二进制,请从所讨论的整数开始,然后将其除以 2,同时注意商和余数。继续将商除以 2,直到商为零。然后以相反的顺序写出余数。 (...) 现在,我们只需要以相反的顺序写出余数——1100。所以,十进制的 12 表示为二进制的 1100。
我正在尝试使数组的大小动态化。来自 Python 这有点令人困惑,因为在 Python 中你可以只追加到一个列表。
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int *ptr, n, i;
ptr = (int*)malloc(1 * sizeof(int));
printf("Enter a number to convert: ");
scanf("%d", &n);
for (i = 0; n>0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i] = n % 2;
n = n/2;
}
for(i=i-1; i>= 0; i--)
{
printf("%d", ptr[i]);
}
free(ptr);
return 0;
}
当我运行程序并输入一个数字时,它不会输出任何内容。如果我对固定的数组大小做同样的事情,它就可以工作。为什么会这样?
【问题讨论】:
-
在第一个循环步骤中,
realloc的大小是多少?接下来呢? -
在 for 循环中 ptr 的大小始终为 i,但是,您正在写入 ptr[i] 超出范围。此外,第一次通过第二个循环时,您读取的 ptr[i] 也超出了范围。
-
这里不需要动态分配。您的输入是一个 int,因此只需将您的数组声明为具有与 int 中的位一样多的元素(可能是 32,也可能是 64)。
-
你已经包含了数学(似乎没有合理的理由),为什么不利用
log10()来计算所需的数组元素的数量并只分配一次呢?