如何在C中存储动态数组中的值

如何在C中存储动态数组中的值,c,dynamic-arrays,C,Dynamic Arrays,我试图给动态数组中的元素赋值,但找不到解决方案。有许多视频显示了如果用户通过scanf输入值,它是如何工作的,但这里不是这样。我真的试图在这里和那里找到信息,并解决它自己,所以任何帮助将高度感谢。 这是我的密码: //Program co convert decimal number to binary and count zeros int main() { int decimalNum; int *binaryNum; int zeroCounter = 0;

我试图给动态数组中的元素赋值,但找不到解决方案。有许多视频显示了如果用户通过scanf输入值,它是如何工作的,但这里不是这样。我真的试图在这里和那里找到信息,并解决它自己,所以任何帮助将高度感谢。 这是我的密码:

//Program co convert decimal number to binary and count zeros
int main()
{
    int decimalNum;
    int *binaryNum;
    int zeroCounter = 0;
    int i = 0;
    int sizeOfArray;
    int decimalNumCopied;


    printf("Please enter a number from 0 to 255: ");
    scanf("%d", &decimalNum);
    decimalNumCopied = decimalNum;

    while(decimalNum != 0)//checking number of bits;
    {
       decimalNum = decimalNum / 2;
       i++;
    }
    sizeOfArray = i;

    //Trying to allocate just enough memory 
    binaryNum = (int*)malloc(sizeOfArray * sizeof(int));


    while(decimalNumCopied != 0)
    {
        /*At next step I am trying to assign values to each element of the
        array and it doesn't work
        */
        binaryNum[i] = decimalNumCopied % 2;
        decimalNumCopied = decimalNumCopied / 2;
        i--;
    }

    for(i = 0; i <= sizeOfArray; i++)
    {
        printf("%d", binaryNum[i]);
        if(binaryNum[i]== 0){zeroCounter++;}
    }
    printf("\nThere are %d zeroes", zeroCounter);

    free(binaryNum);

    return 0;
}
//程序将十进制数转换为二进制数并计算零
int main()
{
整数小数;
int*binaryNum;
int零计数器=0;
int i=0;
int-sizeOfArray;
整数小数位数;
printf(“请输入一个从0到255的数字:”;
scanf(“%d”、&decimalNum);
小数位数=小数位数;
while(decimalNum!=0)//检查位数;
{
小数位数=小数位数/2;
i++;
}
sizeOfArray=i;
//试图分配足够的内存
binaryNum=(int*)malloc(sizeOfArray*sizeof(int));
while(小数位数!=0)
{
/*在下一步中,我将尝试为
数组,它不工作
*/
binaryNum[i]=小数位数%2;
小数位数=小数位数/2;
我--;
}

对于(i=0;i,您的第一个赋值超出了数组的边界。这会导致未定义的行为


请记住,数组是从零开始索引的,因此如果
i
是数组的长度,则它不是有效索引(它超出了上一个有效索引)。

您的第一个赋值超出了数组的边界。这会导致未定义的行为


请记住,数组的索引是从零开始的,因此如果
i
是数组的长度,则它不是有效索引(它超出了最后一个有效索引)。

这里有两个错误

首先,当您开始为数组赋值时,
i
等于数组中的元素数。因为C中的数组有从0到n-1的索引,其中n是长度,所以您正在写一个超过数组末尾的元素。这样做会调用,在这种情况下(幸运的是)会出现崩溃

在进入循环之前,需要将
i
减量一次,以在适当的偏移量开始写入

i--;
while(decimalNumCopied != 0)
{
    ...

第二个问题是打印。您的
for
循环从0开始(应该是这样),但在
i出现两个错误时停止

首先,当您开始为数组赋值时,
i
等于数组中的元素数。因为C中的数组有从0到n-1的索引,其中n是长度,所以您正在写一个超过数组末尾的元素。这样做会调用,在这种情况下(幸运的是)会出现崩溃

在进入循环之前,需要将
i
减量一次,以在适当的偏移量开始写入

i--;
while(decimalNumCopied != 0)
{
    ...

第二个问题是打印。您的
for
循环从0开始(应该是这样的),但在
i我觉得这是一个有用的程序时停止,因此合并了dbush和其他人的答案,这里它是固定的,valgrind检查良好,有一些用户输入错误处理,一些风格更改,或者也接受来自命令行的输入

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char**argv) {
    int decimalNum;
    int *binaryNum;
    int zeroCounter = 0;
    int i = 0;
    int sizeOfArray;
    int decimalNumCopied;

    if (argc == 2) {
        decimalNum = atoi(argv[1]);
    }
    if(argc == 1 || decimalNum < 0 || decimalNum > 255) {
        printf("Please enter a number from 0 to 255: ");
        scanf("%d", &decimalNum);
        while (decimalNum < 0 || decimalNum > 255) {
            printf("Program is expecting an int from 0 to 255 inclusive\n"
                "Please enter a number from 0 to 255: ");
            scanf("%d", &decimalNum);
        }
    }
    decimalNumCopied = decimalNum;

    while (decimalNum != 0) {
        decimalNum /= 2;
        i++;
    }
    sizeOfArray = i;

    binaryNum = malloc(sizeOfArray * sizeof(int));

    i--;
    while (decimalNumCopied != 0) {
        binaryNum[i] = decimalNumCopied % 2;
        decimalNumCopied /= 2;
        i--;
    }

    for (i = 0; i < sizeOfArray; i++) {
        printf("%d", binaryNum[i]);
        if (binaryNum[i] == 0) { zeroCounter++; }
    }
    printf("\nThere are %d zeroes\n", zeroCounter);

    free(binaryNum);

    return 0;
}
#包括
#包括
int main(int argc,字符**argv){
整数小数;
int*binaryNum;
int零计数器=0;
int i=0;
int-sizeOfArray;
整数小数位数;
如果(argc==2){
小数=原子(argv[1]);
}
如果(argc==1 | | decimalNum<0 | | decimalNum>255){
printf(“请输入一个从0到255的数字:”;
scanf(“%d”、&decimalNum);
而(小数位数<0 | |小数位数>255){
printf(“程序需要0到255(含0到255)的整数\n”
“请输入一个从0到255的数字:”;
scanf(“%d”、&decimalNum);
}
}
小数位数=小数位数;
while(小数!=0){
小数/=2;
i++;
}
sizeOfArray=i;
binaryNum=malloc(sizeOfArray*sizeof(int));
我--;
while(小数位数!=0){
binaryNum[i]=小数位数%2;
小数位数/=2;
我--;
}
对于(i=0;i
我觉得这是一个有用的程序,因此结合了dbush和其他人的答案,在这里它是固定的,valgrind检查良好,有一些用户输入错误处理,一些风格变化,或者也接受来自命令行的输入

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char**argv) {
    int decimalNum;
    int *binaryNum;
    int zeroCounter = 0;
    int i = 0;
    int sizeOfArray;
    int decimalNumCopied;

    if (argc == 2) {
        decimalNum = atoi(argv[1]);
    }
    if(argc == 1 || decimalNum < 0 || decimalNum > 255) {
        printf("Please enter a number from 0 to 255: ");
        scanf("%d", &decimalNum);
        while (decimalNum < 0 || decimalNum > 255) {
            printf("Program is expecting an int from 0 to 255 inclusive\n"
                "Please enter a number from 0 to 255: ");
            scanf("%d", &decimalNum);
        }
    }
    decimalNumCopied = decimalNum;

    while (decimalNum != 0) {
        decimalNum /= 2;
        i++;
    }
    sizeOfArray = i;

    binaryNum = malloc(sizeOfArray * sizeof(int));

    i--;
    while (decimalNumCopied != 0) {
        binaryNum[i] = decimalNumCopied % 2;
        decimalNumCopied /= 2;
        i--;
    }

    for (i = 0; i < sizeOfArray; i++) {
        printf("%d", binaryNum[i]);
        if (binaryNum[i] == 0) { zeroCounter++; }
    }
    printf("\nThere are %d zeroes\n", zeroCounter);

    free(binaryNum);

    return 0;
}
#包括
#包括
int main(int argc,字符**argv){
整数小数;
int*binaryNum;
int零计数器=0;
int i=0;
int-sizeOfArray;
整数小数位数;
如果(argc==2){
小数=原子(argv[1]);
}
如果(argc==1 | | decimalNum<0 | | decimalNum>255){
printf(“请输入一个从0到255的数字:”;
scanf(“%d”、&decimalNum);
而(小数位数<0 | |小数位数>255){
printf(“程序需要0到255(含0到255)的整数\n”
“请输入一个从0到255的数字:”;
scanf(“%d”、&decimalNum);
}
}
小数位数=小数位数;
while(小数!=0){
小数/=2;
i++;
}
sizeOfArray=i;
binaryNum=malloc(sizeOfArray*sizeof(int));
我--;
while(小数位数!=0){
binaryNum[i]=小数位数%2;
小数位数/=2;
我--;
}
对于(i=0;i
您的代码有什么问题?您的代码有什么问题?您的问题是什么?请花一些时间来回答。还有一个错误。有效的数组索引是
0
sizeOfArray-