2016-06-20 9 views
-1

In Ordnung, also habe ich mit C herumgespielt, als ich dieses komische Verhalten gefunden habe. Ich habe den Operator sizeof verwendet, um die Größe des Arrays in der Hauptfunktion zu ermitteln, und dann habe ich das Array an eine andere Funktion übergeben und den Operator sizeof erneut verwendet und eine andere Zahl als den Anfangswert erhalten. Das erste Mal, wenn ich es teste, bekomme ich den richtigen Wert von 12 und dann das zweite Mal, wenn ich es teste, habe ich 4 und ich verstehe nicht warum.Der Wert ändert sich in C++ und ich weiß nicht warum

 #include <stdio.h> 
    #include <ctype.h> 

    int canPrint(char ch) { return isalpha(ch) || isblank(ch); } 
    void print_Letters(char arg) 
    { 
     if (canPrint(arg))printf("%c==%d \n",arg,arg); 
    } 
    void printarg(char ch[]) 
    { 
     unsigned int value = sizeof(ch);//returns 4 
     for (int i = 0;i<value; i++) 
     { 
      print_Letters(ch[i]); 
     } 
    } 
    int main(int argc, char *argv[]) 
    { 
     char something[]="work please"; 
     printf("%d \n",sizeof(char));// return 1 
     printf("%d \n",sizeof(something));//returns 12 
     printarg(something); 
     char ch; 
     scanf_s(" %c",&ch);//used to stop program so that I can read results 
     return 0; 
    } 
+2

Frage sagt C, aber Sie haben eine C++ Tag. Welches ist es? – Thebluefish

+0

Wäre es zu viel Mühe, Sie zu bitten, Ihren Code richtig zu formatieren? (Da Sie andere bitten, es zu lesen) – davmac

+0

Entschuldigung, es behoben C++ – bordenE

Antwort

2

void printarg(char ch[]) ist eigentlich äquivalent void printarg(char* ch). Mit anderen Worten, Arrays gehen nicht naturgemäß als Funktionsargumente durch, sondern das Argument ist ein Zeiger.

Daher sizeof(ch) in der Funktion gibt die Größe eines Zeigers zurück.

+0

Dank für die Erklärung – bordenE

0

Wenn mit char* (Art Zeichenfolge in c) arbeitet es besser ist, Schleifen zu verwenden wie:

 #include <string.h> 

    void printarg(char ch[]) 
    { 
     for (int i = 0;i<strlen(ch); i++) 
     { 
      print_Letters(ch[i]); 
     } 
    } 

Oder

 void printarg(char ch[]) 
    { 
     for (int i = 0;ch[i] > 0; i++) 
     { 
      print_Letters(ch[i]); 
     } 
    } 
+0

Danke für die Antwort – bordenE

+0

Das' für (int i = 0 ; i user4581301