[英]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.