簡體   English   中英

如何在C中的動態數組中存儲值

[英]How to store values in dynamic array in C

我正在嘗試為動態數組中的元素分配值,但是找不到解決方案。 有許多視頻顯示了如果用戶通過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;
}

您的第一個分配超出了數組的范圍。 這給您未定義的行為。

請記住,數組是從零開始索引的,所以如果i是數組的長度,則它不是有效的索引(它是最后一個有效索引之外的一個)。

這里有兩個錯誤。

首先,當您開始向數組分配值時, i等於數組中元素的數量。 由於C語言中的數組的索引范圍是0到n-1(其中n是長度),因此您要在數組末尾寫入一個元素。 這樣做會調用未定義的行為 ,在這種情況下(對您來說是幸運的),這會導致崩潰。

您需要在進入循環之前將i減1才能以適當的偏移量開始寫入。

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

第二個問題是印刷。 您的for循環從0開始(應該如此),但在i <= sizeOfArray不再為真時停止。 因此,在最后一次迭代中, i等於sizeOfArray ,因此讀取數組末尾的一個元素。 同樣,這會調用未定義的行為。

將條件更改為<以防止出現這種情況:

for(i = 0; i < sizeOfArray; 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM