C 程序不';不能使用动态数组输出任何内容

C 程序不';不能使用动态数组输出任何内容,c,arrays,malloc,C,Arrays,Malloc,我刚从C开始,我正在尝试创建一个程序,它接受一个数字,并使用以下方法将其转换为二进制(从): 要将整数转换为二进制,请从所讨论的整数开始,并将其除以2,同时注意商和余数。继续将商除以2,直到商为零。然后按相反的顺序写出余数。 (...) 现在,我们只需要以相反的顺序写出剩余的-1100。所以,十进制中的12在二进制中表示为1100 我正在尝试使数组的大小动态变化。来自Python,这有点令人困惑,因为在Python中,您可以只附加到列表中 以下是我目前的代码: #include <stdi

我刚从C开始,我正在尝试创建一个程序,它接受一个数字,并使用以下方法将其转换为二进制(从):

要将整数转换为二进制,请从所讨论的整数开始,并将其除以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;
}
#包括
#包括
#包括
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;