2017-03-13 3 views
1

Ich versuche, Elemente im dynamischen Array Werte zuzuweisen, kann aber keine Lösung finden. Es gibt viele Videos, die zeigen, wie es funktioniert, wenn der Wert vom Benutzer über scanf eingegeben wird, aber hier ist es nicht der Fall. Ich habe wirklich versucht, hier und da Informationen zu finden und es selbst zu lösen, damit jede Hilfe sehr geschätzt wird. Hier ist mein Code:Wie Werte im dynamischen Array in C gespeichert werden

//Program co convert decimal number to binary and count zeros 
int main() 
{ 
    int decimalNum; 
    int *binaryNum; 
    int zeroCounter = 0; 
    int i = 0; 
    int sizeOfArray; 
    int decimalNumCopied; 


    printf("Please enter a number from 0 to 255: "); 
    scanf("%d", &decimalNum); 
    decimalNumCopied = decimalNum; 

    while(decimalNum != 0)//checking number of bits; 
    { 
     decimalNum = decimalNum/2; 
     i++; 
    } 
    sizeOfArray = i; 

    //Trying to allocate just enough memory 
    binaryNum = (int*)malloc(sizeOfArray * sizeof(int)); 


    while(decimalNumCopied != 0) 
    { 
     /*At next step I am trying to assign values to each element of the 
     array and it doesn't work 
     */ 
     binaryNum[i] = decimalNumCopied % 2; 
     decimalNumCopied = decimalNumCopied/2; 
     i--; 
    } 

    for(i = 0; i <= sizeOfArray; i++) 
    { 
     printf("%d", binaryNum[i]); 
     if(binaryNum[i]== 0){zeroCounter++;} 
    } 
    printf("\nThere are %d zeroes", zeroCounter); 

    free(binaryNum); 

    return 0; 
} 
+2

Und was ist falsch an Ihrem Code? Welche Probleme hast du damit? Was ist deine Frage*? Bitte nehmen Sie sich etwas Zeit (lesen Sie, wie Sie gute Fragen stellen können) (http://stackoverflow.com/help/how-to-ask). –

+1

Auch [werfen Sie nicht das Ergebnis von 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – UnholySheep

+1

Aus mit einem Fehler. Gültige Array-Indizes sind "0" bis "sizeOfArray - 1". Der Körper der 'while (decimalNumCopied! = 0)' kopiert eins nach dem Ende von 'binaryNum' in der ersten Iteration. – Peter

Antwort

4

Ihre erste Aufgabe außerhalb der Grenzen des Arrays ist. Dies gibt Ihnen undefiniertes Verhalten.

Denken Sie daran, dass Arrays von Null indiziert werden, also wenn i die Länge des Arrays ist, ist es kein gültiger Index (es ist ein Index hinter dem letzten gültigen Index).

+0

Vielen Dank für Ihre Antwort. Ich war irgendwie sicher, dass ich etwas mit dem Zeiger verwechselte und einen so offensichtlichen Fehler verpasste. – libengazi

3

Es gibt zwei Fehler hier.

Erstens, wenn Sie beginnen, dem Array Werte zuzuweisen i ist gleich der Anzahl der Elemente im Array. Da Arrays in C Indizes von 0 bis n-1 haben, wobei n die Länge ist, schreiben Sie ein Element über das Ende des Arrays hinaus. Dies ruft undefined behavior auf, was sich in diesem Fall (Glück für Sie) in einem Absturz manifestiert.

Sie müssen i einmal dekrementieren, bevor Sie in die Schleife eintreten, um mit dem richtigen Offset zu beginnen.

i--; 
while(decimalNumCopied != 0) 
{ 
    ... 

Das zweite Problem ist mit dem Drucken. Ihre for Schleife beginnt bei 0 (wie es sollte), aber stoppt, wenn i <= sizeOfArray nicht mehr wahr ist. Also in der letzten Iteration i ist gleich sizeOfArray, so lesen Sie ein Element nach dem Ende des Arrays. Dies ruft wiederum undefiniertes Verhalten auf.

Ändern Sie den Zustand < dies zu verhindern:

for(i = 0; i < sizeOfArray; i++) 
0

Ich fühlte dies ein nützliches Programm, so war die Antwort von dbush und andere enthalten, hier ist es fest, valgrind Kontrollen gut, mit einigen Benutzereingabefehler Handhabung, einige stilistische Änderungen und akzeptiert alternativ auch Eingaben von der Kommandozeile.

#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char**argv) { 
    int decimalNum; 
    int *binaryNum; 
    int zeroCounter = 0; 
    int i = 0; 
    int sizeOfArray; 
    int decimalNumCopied; 

    if (argc == 2) { 
     decimalNum = atoi(argv[1]); 
    } 
    if(argc == 1 || decimalNum < 0 || decimalNum > 255) { 
     printf("Please enter a number from 0 to 255: "); 
     scanf("%d", &decimalNum); 
     while (decimalNum < 0 || decimalNum > 255) { 
      printf("Program is expecting an int from 0 to 255 inclusive\n" 
       "Please enter a number from 0 to 255: "); 
      scanf("%d", &decimalNum); 
     } 
    } 
    decimalNumCopied = decimalNum; 

    while (decimalNum != 0) { 
     decimalNum /= 2; 
     i++; 
    } 
    sizeOfArray = i; 

    binaryNum = malloc(sizeOfArray * sizeof(int)); 

    i--; 
    while (decimalNumCopied != 0) { 
     binaryNum[i] = decimalNumCopied % 2; 
     decimalNumCopied /= 2; 
     i--; 
    } 

    for (i = 0; i < sizeOfArray; i++) { 
     printf("%d", binaryNum[i]); 
     if (binaryNum[i] == 0) { zeroCounter++; } 
    } 
    printf("\nThere are %d zeroes\n", zeroCounter); 

    free(binaryNum); 

    return 0; 
} 
+0

Ich nehme an, es ist eine lahme Frage, aber würden Sie erklären, warum malloc in diesem Fall nicht als ganze Zahl (der Typ der Variablen binaryNum) eingegeben werden sollte? – libengazi

+0

Keine Notwendigkeit, die obige Frage zu beantworten - Ich habe dieses Thema gelesen: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc?noredirect=1&lq=1 – libengazi

Verwandte Themen