我有一個分配的陣列,需要檢查所有欄位并比較非空值。這個陣列中的值也可以是 0,這給我帶來了一些麻煩。
int size = 4;
int *numbers = (int*) malloc(size * 4);
// Fill some fields
numbers[0] = 3;
numbers[1] = 0;
numbers[2] = 6;
// Search and find min value's index
int min = 0;
for (int i = 0; i < size; i ) {
if (numbers[i] != NULL) {
if (numbers[i] < numbers[min]) min = i;
} else {
// Code if value is null here
}
}
printf("%d\n", min);
我不確定如何與 NULL 正確比較。正確的方法是什么?
uj5u.com熱心網友回復:
你分配的陣列元素永遠不會為NULL。即使是使用 free 函式釋放的記憶體也不是 NULL。它可以指向任何你自己的程式地址空間或外部地址空間的任何東西。
你的代碼看起來不錯。您沒有分配給索引 3 處的元素的值可以是垃圾但不能是 NULL
uj5u.com熱心網友回復:
你的整體設計有缺陷。您不應將其NULL視為全面的零值。NULL是一個特殊的指標值,而不僅僅是一個整數。如果您比較 an intagainst NULL,您就是在比較兩種不同的型別,這不是一個好主意。此外,您將標量型別與指標型別進行比較,這甚至更糟。
這個陣列中的值也可以是 0,這給我帶來了一些麻煩。
如果是這種情況,則不能0同時用作“非現值”的值和“標記”。問題是,你不能使用NULL任何一種,因為它是一種不同的型別。如果您嘗試使用它,編譯器會警告您(或者至少應該,如果您啟用警告)。充其量,賦值NULL會將其隱式轉換為int并導致0因為NULL通常定義為((void *)0),因此無法區分 NULL 值和有效值。
您必須保留之間的值之一INT_MIN,并INT_MAX為此目的:
#include <limits.h>
enum { NOT_PRESENT = INT_MIN };
int size = 4;
int *numbers = malloc(size * sizeof(int));
// Initialize all to NOT_PRESENT
for (int i = 0; i < size; i )
numbers[i] = NOT_PRESENT;
// Fill some fields
numbers[0] = 3;
numbers[1] = 0;
numbers[2] = 6;
// Search and find min value's index
int min = 0;
for (int i = 0; i < size; i ) {
if (numbers[i] != NOT_PRESENT) {
if (numbers[i] < numbers[min]) min = i;
} else {
// Code if value is not present here
}
}
printf("%d\n", min);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368759.html
上一篇:我需要從另一個物件陣列的另一個鍵減去物件陣列的一個鍵
下一篇:在C中下溢時損壞的fgets輸入
