簡體   English   中英

我從不說 2 arrays 彼此相等,但在 output 他們在 C

[英]I never say 2 arrays equal to each other but in output they do in C

這是我的代碼:

#include <stdio.h>
void sort(int array[], int n)
{
    int i, j, temp;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < (n - i - 1); j++)
        {
            if (array[j] > array[j + 1])
            {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
            }
        }
    }
        for (i = 0; i < n; i++)
            printf("%d ", array[i]);
}

int main()
{
    int n, lower, upper, numbers[500], m = 0, sub_numbers[m], k = 0, index[k];
    int i;
    scanf("%d %d %d", &n, &lower, &upper);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &numbers[i]);
    }
    for(i = 0; i < n; i++)
    {
        if ((numbers[i] > lower) && (numbers[i] < upper))
        {
            sub_numbers[m] = numbers[i];
            index[k] = i;
            m++;
            k++;
        }
    }
    sort(sub_numbers, m);
    printf("\n");
    for (i = 0; i < k; i++)
        printf("%d ", index[i]);


    return 0;
}

我從不說 sub_numbers[m] = index[k] 但在 output 中我在兩行都得到 index[k] 而我必須在第一行有 sub_numbers 在第二行有索引。 如果我評論 //index[k] = i; 那么 arrays 都是子編號 arrays

你有:

int n, lower, upper, numbers[500], m = 0, sub_numbers[m], k = 0, index[k];

您有 UB(未定義的行為)- sub_numbers是大小為 0 的可變長度數組(VLA), index也是如此。 嚴格的 C 不允許大小為 0 的 arrays(C11 §6.7.6 數組聲明器¶1,¶5 )。 GCC 確實允許大小為零的 arrays,但在其中存儲任何內容都是 UB。

有了 UB,一切皆有可能——沒有必要去猜測還會發生什么。

您可以合理地合理地修復您的代碼,方法是不定義您的 arrays 直到您從用戶那里讀取n (並驗證它的基本健全性 - 大於零,小於,為了爭論,65,536)。 然后你會寫:

int n;
scanf("%d", &n);   // Check success
// Check n for sanity
int numbers[n], sub_numbers[n], index[n];

您現在已經擁有了三個 arrays,它們應該適合普通台式機或服務器級機器的堆棧 — 如果您有嵌入式系統,則可能需要更加小心。 我已將 arrays 限制為大約 3/4 MiB(如果大小為 65,536,則每個為 1/4 MiB)。 如果您需要處理更多數據,則不會從用戶輸入中讀取數據,您應該使用malloc()和朋友的動態 memory 分配。

因為您正在分配一個可變大小的數組,而沒有malloc的函數。 例如index[k]k = 0 之后會導致未定義的行為。 現在,如果要使用malloc分配數組,則不能將任何內容放入大小為零的數組中。 因此,您可以使用malloc (如果您需要動態大小分配)和更高的 arrays 大小值來修改您的代碼。

暫無
暫無

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

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