2017-07-05 1 views
-4

ich auf einem C-Programm zu arbeiten und ich ein seltsames Verhalten mit scanf gefunden:Sonderbare Scanf Verhalten

#include <stdio.h> 

int main() { 
    int *a, i; 
    printf("Hello, World!\n"); 
    for (i = 0; i < 10; i++) { 
     scanf("%u", &a[i]); 
    } 
    for (i = 0; i < 10; i++) { 
     printf("%d\n", a[i]); 
    } 
    return 0; 
} 

Für 10 Eingang I + und der Ausgang geschickt war wie:

1                                                    
0                                                    
239646720                                                  
32767                                                   
0                                                    
0                                                    
239646727                                                  
32767                                                   
239646771                                                  
32767 

ich erwartet ein Speicherleck, könnte mir bitte jemand dieses Verhalten erklären?

+4

Sie haben einen Zeiger 'a', aber * wo kommt Punkt es * –

+0

Pointer UB nicht :( – ThingyWotsit

+1

* I seltsames Verhalten, wenn ich schreibe? ein Array, das ich nicht zugewiesen habe, und dann versuchen, es zurückzulesen. Was ist los? * Ein Zeiger auf 'int' ist kein Array, und Sie können es nicht als eins verwenden. –

Antwort

0

Da Sie keinen Speicher dynamisch zuweisen, erhalten Sie kein Speicherleck. Sie greifen jedoch auf nicht zugeordneten Speicher zu, der nicht mit einem Speicherverlust identisch ist.

Ich bin mir nicht sicher, was Sie erreichen möchten, indem Sie ein + eingeben, aber das Verhalten der Verwendung eines nicht initialisierten Zeigers ist nicht definiert.

+0

Aber was ich hier nicht sehen kann, warum Senden + hat nichts geändert? – Alex

+0

Sie verwenden scanf auf die falsche Weise. Ich verstehe nicht wirklich, warum etwas passiert. scanf ("% u") wird verwendet, um eine vorzeichenlose Ganzzahl zu lesen, und Sie senden etwas, das nicht ist. – klutt

1

Wenn Sie einfach 10 ganzen Zahlen in ein Array speichern wollte und später sie zu drucken, würde dies tun: -

#include<stdio.h> 
int main() 
{ 
    int a[9],i ; 
    printf("Hello, World!\n"); 
    for(i = 0;i<10;i++)` 
    { 
     scanf("%u",&a[i]); 
    } 

    for(i = 0;i<10;i++) 
    { 
     printf("%d\n",a[i]) ; 
    } 
    return 0; 
} 
+3

"10 Ganzzahlen zu einem Array speichern" + 'int a [9]' sollte überprüft werden. – chux

0

Mehrere Probleme im Code:

  • a ist eine nicht initialisierte Zeiger, Sie sollten es stattdessen als ein Array von 10 int definieren. Wie codiert, hat Ihr Programm undefiniertes Verhalten, es ist ziemlich überraschend, dass es überhaupt läuft.
  • sollten Sie den Rückgabewert von scanf() überprüfen: Wenn die Konvertierung fehlschlägt, gibt es 0 oder EOF zurück und das Ziel wird nicht geändert, das Drucken hat undefiniertes Verhalten. Wenn nur ein + Vorzeichen für eine Ganzzahl eingegeben wird, führt dies zu einem Konvertierungsfehler. Hier

ist eine korrigierte Version:

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

int main(void) { 
    int a[10], i; 
    printf("Hello, World!\n"); 
    for (i = 0; i < 10; i++) { 
     if (scanf("%u", &a[i]) != 1) { 
      fprintf(stderr, "input error\n"); 
      exit(1); 
     } 
    } 
    for (i = 0; i < 10; i++) { 
     printf("%d\n", a[i]); 
    } 
    return 0; 
} 
+0

Das Programm, mit dem ich es zu tun hatte, war ein anfälliger Dienst. Ich bemerkte dieses Verhalten, also fragte ich danach – Alex

+0

Ziemlich schwach und verletzlich in der Tat – chqrlie