C - Zkontrolujte, zda je přiřazen Integer

hlasů
26

Jak mohu zjistit, zda číslo je unassigned?

int i; /* no assignment */

if (/* conditional statement here to check if int i is unassigned or not */) {
   printf(Integer is unassigned!\n);
} else {
   printf(Integer is assigned!\n);
}
Položena 04/08/2009 v 10:26
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
20

Nemůžete. To bude mít „nedefinovaný“ obsah, což znamená, že bude obsahovat to, co někdy se stane, že v tomto paměťovém místě v té době.

, , , pokud i je deklarován v globálním měřítku, pak to bude inicializovat na nulu.

Odpovězeno 04/08/2009 v 10:28
zdroj uživatelem

hlasů
8

C není skutečně podporovat to - stejně jako to není skutečně podporovat kontrolou hranic na polích. Je to kompromis mezi rychlostí / účinnosti a bezpečnosti.

Obecně lze říci ... inicializovat proměnné.

Odpovězeno 04/08/2009 v 10:28
zdroj uživatelem

hlasů
7

Je to velmi jednoduché. Víte, že je neobsazená, protože jste ji inicializovat.

Odpovězeno 04/08/2009 v 10:29
zdroj uživatelem

hlasů
4

Jak si všimli jiní, nemůžete napsat program v jazyce C, který zjišťuje, zda jeden z jejích vlastních proměnných je inicializována, a měli byste se snažit, aby se ujistil, že proměnné jsou vždy inicializuje.

  • Pokud je vaším cílem je, aby se ujistil všechny proměnné jsou inicializovány, nástroj jako valgrind dokáže detekovat využití neinicializované proměnné dynamicky , a to prostřednictvím nákladných run-time analýzy.

  • Pokud je vaším cílem je, aby se ujistil, že soukromé údaje se inicializuje přesně jednou, obvyklá metoda je chránit ji s

    int i;
    static bool initialized = 0;
    
    ... 
    if (!initialized) {
      initialized = 1;
      i = ... i's initial value ...;
    }
    
Odpovězeno 04/08/2009 v 17:10
zdroj uživatelem

hlasů
4

Budete mít možnost požádat o varování kompilátoru, pokud používáte neinicializované hodnoty. Oni nejsou zcela spolehlivé, ale - vám občasné falešně pozitivní, kde DFA není tak chytrý, jak jste doufali, a možná i občasné falešně negativní (bych, že ne, ale slibuji, že nic).

GCC:

-Wuninitialized -O1

Chcete-li psát podmíněné kód:

int a = 3;
int b;
int *p = (rand() > RAND_MAX/2) ? &a : &b;
if (is_uninitialized(*p)) // blah

pak jste smůlu. Na rozdíl od některých dynamických jazyků, C nemá žádnou představu o „nedefinované hodnoty“. Je-li proměnná není inicializována, že není dána nějakou zvláštní hodnotu, která může být testována na později. Není to vzhledem k tomu, hodnotu vůbec, takže to nedefinované, co se stane, když používáte proměnnou.

Odpovězeno 04/08/2009 v 10:39
zdroj uživatelem

hlasů
4

Pokud ije globální nebo statické, bude jeho hodnota bude 0, jinak jeho hodnota může být cokoliv, a není tam žádný způsob, jak zjistit, zda je odpad, či nikoliv.

Odpovězeno 04/08/2009 v 10:28
zdroj uživatelem

hlasů
1

Pomocí proměnné před intialization (nebo postoupení) je vážným důvodem chyb. Nemůžete spolehlivě kontrolovat jej za běhu, ale můžete zjistit, že před nebo během kompilace.

Navrhuji to podívat se na to uvnitř kódu. Vzhledem k tomu, je to pravděpodobně způsobí varování kompilátoru (Variable ‚i‘ je používán před tím, než byla přiřazena hodnota), zavádět nové chyby a má velmi malou šanci na úspěch ve středních a velkých programů.

Nejlepší je použít statické kód analys nástroje (jako QA / C nebo PCLint). Používání kompilátoru na úrovni citlivosti high varování je bezplatná varianta, s mnohem menším pokrytím jako specializované nástroje.

Máte-li provést revize kódu, můžete také zahrnovat šek na neinicializované proměnné na seznamu. To není žádná záruka, ale to bude spouštět manuální kontroly ze strany recenzentů.

Pokud je to runtime kontrolu chcete, pak si můžete začít vedlejších intializing proměnné out-of-rozsah hodnot. Například -1 jinak postive hodnotu. Pak můžete zkontrolovat

#define UNASSIGNED_VALUE -1
    static int number_of_apples = UNASSIGNED_VALUE;
    if (UNASSIGNED_VALUE == number_of_apples)
    {
       // error handling
    }

to není pravda, ‚unintialized‘ proměnná, ale alespoň si můžete zjistit, zda runtime úkoly v povoleném rozsahu byly provedeny.

Odpovězeno 04/08/2009 v 11:05
zdroj uživatelem

hlasů
1

Stejně jako všechny předchozí odpovědi, není tam žádný způsob, jak zjistit, že při běhu. Nicméně, téměř všechny statickou analýzu kódu nástroj s varují, že nepřiřazené proměnné.

Odpovězeno 04/08/2009 v 10:38
zdroj uživatelem

hlasů
1

Obvykle proměnné jsou nastaveny na hodnotu 0, C knihovna, ale ne nutně.

Ale v podstatě, to nemůžeš. Přiřadit jim výchozí hodnotu v definici, například:

int i = 0; /* Or what ever value you know won't be used elsewhere */

A pokud si spustit nějaký kód a chcete zjistit, jestli tam byla nastavena hodnota, můžete porovnat na vaše počáteční hodnoty.

Odpovězeno 04/08/2009 v 10:29
zdroj uživatelem

hlasů
0

V C # bych použít:

Nullable<int> i = null; /* null assignment */

if (i == null) {
   printf("Integer is unassigned!\n");
} else {
   printf("Integer is assigned!\n");
}

Není si jistý, jestli this'd přeložit do C, ačkoli.

Odpovězeno 23/11/2012 v 06:40
zdroj uživatelem

hlasů
0

Kontrola, zda je či není proměnná, kterou používáte se inicializuje (přiděleno) při běhu je notoricky obtížné pro C. Neexistuje žádná jazyková podpora pro něj, a dostupné za běhu informace prostě nestačí na dokonalou detekci neinicializované hodnoty. Dynamická analýza nástroje jako Valgrind / Memcheck prochází krajnosti (například sledování každého bajtu paměti v adresovém prostoru vašeho procesu a pak zkoumá každou prodejnu označit byte jako intiialized) zjistit, zda je či není inicializován hodnotu pomocí a jsou ještě citlivé na falešných poplachů.

Pokud jste jen snaží minimalizovat tyto chyby ve svých programech, statické analytické nástroje, jako je chmýří můžete udělat docela dobrou práci, informující o tom, zda používáte neinicializované proměnné. Ve skutečnosti jsem přesvědčen, že většina překladačů udělají vše, aby vám říct, když děláte to (i když, oni jsou jistě není dokonalý.)

Odpovězeno 04/08/2009 v 11:13
zdroj uživatelem

hlasů
0

V C, celé číslo se na nedefinovanou hodnotu, když je vytvořen. To znamená, že pokud vaše první použití tohoto integer pochází z rejstříku / místa v paměti / zařízení s 5893872 v tom, že je hodnota této integer. (Tachometru se liší pro sestavení ladění / uvolňování).

Obvyklý způsob řešení je použití nesmyslný výchozí:

int number_of_widgets = -1;

... nebo příznak k označení jeho stavu:

int number_of_widgets;
int number_of_widgets_assigned = 0;

if (number_of_widgets_assigned)
  do something
else
  do something else
number_of_widgets_assigned = 1;

Neexistuje žádný jiný způsob, jak zjistit, zda je něco bylo přiděleno - pokud se chcete dostat do ladicích funkcí vašeho hardware a mám podezření, že je to, co tento rozhovor je.

Odpovězeno 04/08/2009 v 10:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more