2016-08-04 21 views
2

I hat diese int Array in C und initialisiert es mit 0 wie folgt -Array Initialisierung mit 0 in C

int f[10000] = {0}; 

Mein Programm mir verlangt diese Anordnung am Ende der Schleife reinitialisieren. Also, ich habe diesen Schritt ausgeführt -

f[10000] = 0; 

Aber das hat nicht funktioniert. Ich versuchte sogar

f[10000] = {0}; 

, aber Fehler in ihm auch. Letztendlich musste ich memset verwenden. Kann jemand helfen, wo der Fehler auftritt und warum?

EXTRA INFO - I USED ideone.com FÜR EINEN BESTIMMTEN ZWECK CODING

Für die Referenz, hier ist der komplette Code -

#include <stdio.h> 

int main(void) { 
    int t, n, k, f[10000] = {0}, c[10000] = {0}, i, v, count = 0; 
    scanf("%d", &t); 
    while (t--) { 
     scanf("%d %d", &n, &k); 
     for (i = 1; i <= n; i++) { 
      scanf("%d", &v); 
      if (v == i) { 
       f[i] = 1; 
      } 
      c[v]++; 
     } 
     for (i = 1; i <= n; i++) { 
      if (!f[i] && c[i] >= k) { 
       count++; 
      } 
     } 
     printf("%d\n", count); 
     count = 0; 
     memset(f, 0, 10000); 
     memset(c, 0, 10000); 
     //f[10000] = 0; this didn't worked 
     //c[10000] = 0; this didn't worked 
    } 
    return 0; 
} 
+2

Arrays werden auf Null basierende in C: F [10000] = 0; Überläuft das Array. Der maximale Array-Index beträgt in Ihrem Fall 9999. Außerdem beginnt Ihr Schleifenzähler bei eins und Sie werden immer über das erste Array-Element gehen. Außerdem könnte Ihr Schleifenzähler versuchen, auf ein Array-Element außerhalb der Grenzen zuzugreifen.memset sollte funktionieren –

+0

@ clarasoft-it "memset" wird nicht ordnungsgemäß funktionieren, da es die Größe des Datenelements nicht berücksichtigt. –

+0

@ Weather-Vane ja, du hast Recht !!! sollte 10000 * sizeof (int) verwenden. Danke für das Aufzeigen :-) –

Antwort

7

In C Initialisierung ist nicht das gleiche wie Zuordnung , obwohl beide = verwenden.

int foo[3] = { 0 }; 

bedeutet „foo eine Anordnung von drei ganzen Zahlen bilden, die alle auf Null initialisiert“, aber foo[3] = 0; bedeutet „eingestellt das vierte Element foo auf Null“. Klar anders.

Und da memset() Werke in Bytes, dies:

memset(f, 0, 10000); 

falsch ist, sollte es sein:

memset(f, 0, sizeof f); 

solange f eine richtige Anordnung wie in Ihrem Code.

Beachten Sie auch, dass sehr große Arrays als automatische Variablen möglicherweise nicht sehr portabel sind.

+1

Beachten Sie, dass sizeof ein kompilierzeitaufgelöster Operator ist und nicht funktioniert, wenn Sie ihn beispielsweise für ein Array verwenden, das als Parameter für eine Funktion übergeben wurde. – javey

+2

@javey Das ist, was ich mit "richtiges Array" meinte, Arrays können nicht als selbst an Funktionen übergeben werden (sie zerfallen zu Zeigern), was wohlbekannt ist. – unwind

+0

@javey, Sie haben Recht, dass 'sizeof' unter den meisten (aber nicht allen) Umständen zur Kompilierzeit ausgewertet werden kann. Sie können sich jedoch darauf verlassen, dass die Größe des vom Operanden angegebenen Typs ausgewertet wird. Der Trick besteht darin, sicher zu sein, dass Sie wissen, um welchen Typ es sich handelt, einschließlich der Tatsache, dass Arrays * niemals * als Funktionsargumente übergeben werden, selbst wenn die Funktionsdeklaration scheinbar etwas anderes nahelegt. –

1

Wenn Sie dieses tat

int f[10000] = {0}; 

dann

f[10000] = 0; 

ist falsch, da Index bei 0 in C beginnt, so dass Sie außerhalb der Arraygrenzen schreiben.

0

As previously mentioned können Sie einem Array nicht zuweisen. Sie können jedoch eine struct zuweisen.

struct foo { int f[1000]; } f = {}; 

Dann

f = (struct foo){};