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

时间:2017-03-13 12:45:01

标签: c dynamic-arrays

我正在尝试为动态数组中的元素赋值,但无法找到解决方案。如果用户通过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;
}

3 个答案:

答案 0 :(得分:4)

您的第一个作业超出了数组的范围。这会给你未定义的行为。

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

答案 1 :(得分:3)

这里有两个错误。

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

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

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

第二个问题是打印。您的for循环从0开始(应该如此),但在i <= sizeOfArray不再为真时停止。所以在最后一次迭代i等于sizeOfArray,所以读取一个元素超过数组的末尾。同样,这会调用未定义的行为。

将条件更改为<以防止此情况:

for(i = 0; i < sizeOfArray; i++)

答案 2 :(得分:0)

我觉得这是一个有用的程序,所以结合dbush和其他人的答案,这里修复,valgrind检查好,有一些用户输入错误处理,一些风格变化,或者也接受来自命令行的输入。 / p>

#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;
}