C 程序不';不能使用动态数组输出任何内容
我刚从C开始,我正在尝试创建一个程序,它接受一个数字,并使用以下方法将其转换为二进制(从): 要将整数转换为二进制,请从所讨论的整数开始,并将其除以2,同时注意商和余数。继续将商除以2,直到商为零。然后按相反的顺序写出余数。 (...) 现在,我们只需要以相反的顺序写出剩余的-1100。所以,十进制中的12在二进制中表示为1100 我正在尝试使数组的大小动态变化。来自Python,这有点令人困惑,因为在Python中,您可以只附加到列表中 以下是我目前的代码:C 程序不';不能使用动态数组输出任何内容,c,arrays,malloc,C,Arrays,Malloc,我刚从C开始,我正在尝试创建一个程序,它接受一个数字,并使用以下方法将其转换为二进制(从): 要将整数转换为二进制,请从所讨论的整数开始,并将其除以2,同时注意商和余数。继续将商除以2,直到商为零。然后按相反的顺序写出余数。 (...) 现在,我们只需要以相反的顺序写出剩余的-1100。所以,十进制中的12在二进制中表示为1100 我正在尝试使数组的大小动态变化。来自Python,这有点令人困惑,因为在Python中,您可以只附加到列表中 以下是我目前的代码: #include <stdi
#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;
}
#包括
#包括
#包括
int main()
{
int*ptr,n,i;
ptr=(int*)malloc(1*sizeof(int));
printf(“输入要转换的数字:”);
scanf(“%d”和“&n”);
对于(i=0;n>0;i++)
{
ptr=realloc(ptr,i*sizeof(int));
ptr[i]=n%2;
n=n/2;
}
对于(i=i-1;i>=0;i--)
{
printf(“%d”,ptr[i]);
}
免费(ptr);
返回0;
}
当我运行程序并输入一个数字时,它不会输出任何东西。如果我对固定的数组大小执行相同的操作,它就会工作。为什么会发生这种情况?问题在于以下几行:
for (i = 0; n>0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i] = n % 2;
n = n/2;
}
您正在重新分配一个数组,该数组每次都能保存i
整数,但最终会写入索引i
。包含i
整数的数组具有从0
到i-1
的索引,因此您的写入超过了数组的末尾。这会导致未定义的行为
最简单的解决方法是从i=1
开始,然后写入ptr[i-1]
:
for (i = 1; n > 0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i - 1] = n % 2;
n = n/2;
}
更简单的方法是使用固定大小的数组。您已经知道
int
的长度是8*sizeof(int)
位,因此这是您需要的最大长度。此外,您可能不需要使用有符号整数,因为它们可能会导致负值问题(因此可以使用无符号
)
编辑:我说的是8*sizeof(int)
,因为操作符返回类型的大小(在本例中为int
)。一个字节是8位,所以我把它乘以8得到以位为单位的大小。我在这里说了8
,但是使用CHAR\u-BIT
(from)会更好,因为C中的“字节”可以用超过8位来表示,在这种情况下CHAR\u-BIT
保持每个字节的正确位数。我不知道有哪种C实现的CHAR\u BIT
的值不同于8
,但这是正确的方法。我将下面的代码更新为使用CHAR\u BIT
而不是8
#include <stdio.h>
#include <limits.h>
#define N_BITS CHAR_BIT * sizeof(unsigned)
int main(void) {
unsigned digits[N_BITS] = {0}; // Start with an array filled with zeroes.
unsigned n;
int i;
printf("Enter a number to convert: ");
scanf("%u", &n);
// Calculate binary digits.
for (i = 0; n > 0; i++) {
digits[i] = n % 2;
n /= 2;
}
// Skip leading zeroes.
while (digits[i] == 0)
i--;
// Print binary digits in reverse order.
for(; i >= 0; i--)
printf("%u", digits[i]);
// Final newline.
putchar('\n');
return 0;
}
#包括
#包括
#定义N位字符*大小(无符号)
内部主(空){
无符号数字[N_位]={0};//从一个填充有零的数组开始。
无符号n;
int i;
printf(“输入要转换的数字:”);
scanf(“%u”、&n);
//计算二进制数字。
对于(i=0;n>0;i++){
数字[i]=n%2;
n/=2;
}
//跳过前导零。
while(数字[i]==0)
我--;
//按相反顺序打印二进制数字。
对于(;i>=0;i--)
printf(“%u”,数字[i]);
//最后换行。
putchar('\n');
返回0;
}
奖金:
#include <stdio.h>
int main(void) {
int i = 8 * sizeof(unsigned);
unsigned n;
printf("Enter a number to convert: ");
scanf("%u", &n);
while (i--)
putchar('0' + ((n >> i) & 1));
putchar('\n');
return 0;
}
#包括
内部主(空){
int i=8*sizeof(无符号);
无符号n;
printf(“输入要转换的数字:”);
scanf(“%u”、&n);
而(我--)
putchar('0'+((n>>i)和1));
putchar('\n');
返回0;
}
问题在于以下几行:
for (i = 0; n>0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i] = n % 2;
n = n/2;
}
您正在重新分配一个数组,该数组每次都能保存i
整数,但最终会写入索引i
。包含i
整数的数组具有从0
到i-1
的索引,因此您的写入超过了数组的末尾。这会导致未定义的行为
最简单的解决方法是从i=1
开始,然后写入ptr[i-1]
:
for (i = 1; n > 0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i - 1] = n % 2;
n = n/2;
}
更简单的方法是使用固定大小的数组。您已经知道
int
的长度是8*sizeof(int)
位,因此这是您需要的最大长度。此外,您可能不需要使用有符号整数,因为它们可能会导致负值问题(因此可以使用无符号
)
编辑:我说的是8*sizeof(int)
,因为操作符返回类型的大小(在本例中为int
)。一个字节是8位,所以我把它乘以8得到以位为单位的大小。我在这里说了8
,但是使用CHAR\u-BIT
(from)会更好,因为C中的“字节”可以用超过8位来表示,在这种情况下CHAR\u-BIT
保持每个字节的正确位数。我不知道有哪种C实现的CHAR\u BIT
的值不同于8
,但这是正确的方法。我将下面的代码更新为使用CHAR\u BIT
而不是8
#include <stdio.h>
#include <limits.h>
#define N_BITS CHAR_BIT * sizeof(unsigned)
int main(void) {
unsigned digits[N_BITS] = {0}; // Start with an array filled with zeroes.
unsigned n;
int i;
printf("Enter a number to convert: ");
scanf("%u", &n);
// Calculate binary digits.
for (i = 0; n > 0; i++) {
digits[i] = n % 2;
n /= 2;
}
// Skip leading zeroes.
while (digits[i] == 0)
i--;
// Print binary digits in reverse order.
for(; i >= 0; i--)
printf("%u", digits[i]);
// Final newline.
putchar('\n');
return 0;
}
#包括
#包括
#定义N位字符*大小(无符号)
内部主(空){
无符号数字[N_位]={0};//从一个填充有零的数组开始。
无符号n;
int i;
printf(“输入要转换的数字:”);
scanf(“%u”、&n);
//计算二进制数字。
对于(i=0;n>0;i++){
数字[i]=n%2;
n/=2;
}
//跳过前导零。
while(数字[i]==0)
我--;
//按相反顺序打印二进制数字。
对于(;i>=0;i--)
printf(“%u”,数字[i]);
//最后换行。
putchar('\n');
返回0;
}
奖金:
#include <stdio.h>
int main(void) {
int i = 8 * sizeof(unsigned);
unsigned n;
printf("Enter a number to convert: ");
scanf("%u", &n);
while (i--)
putchar('0' + ((n >> i) & 1));
putchar('\n');
return 0;
}
#包括
内部主(空){
int i=8*sizeof(无符号);
无符号n;
printf(“输入要转换的数字:”);
scanf(“%u”、&n);
ptr = realloc( ptr, ( n + 1 ) * sizeof( unsigned int ) );
unsigned int *tmp = realloc( ptr, ( n + 1 ) * sizeof( unsigned int ) );
if ( tmp ) ptr = tmp;