2017-05-10 12 views
-6

Ich habe diesen CodeFalsches Ergebnis in c-Code

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

main() 
{ 
    double b;int a[2],*c; 
    void myfunction(); 
    c=(int*)(malloc(1)); 
    b=10.; 
    *c=5; 
    a[1]=1;a[2]=2; 

    printf("before call %f $d $d %d\n",b,a[1],a[2],*c); 
    printf("before call %f $d $d %d\n",b,a[1],a[2],*c); 
    myfunction(b,a,c); 
    printf("after call %f $d $d %d\n",b,a[1],a[2],*c); 
} 

void myfunction(x,y,d) 
    double x;int y[2],*d; 
{ 
    double z; 
    x=2*x; 
    y[1]=3*y[1]; 
    y[2]=3*y[2]; 
    *d =*d+2; 
} 

, wenn ich es ausführen ich erhalte diese

before call 10.000000 $d $d 1 
before call 10.000000 $d $d 1 
after call 10.000000 $d $d 3 

Ich erwarte, dass bekommen 5 in der ersten und zweiten Anruf und 7 in den letzten Anruf, auch a [i] wird nicht angezeigt. Könnten Sie mir bitte raten warum? Danke

+2

'%', nicht '$' ... –

+2

'c = (int *) (malloc (1)); [...] * c = 5; Out-of-Bounds-Zugriff, undefiniertes Verhalten. – EOF

+1

Auch FWIW Dieser Code ist super nicht-idiomatisch - Variablen verschiedener Typen, die in derselben Zeile deklariert sind, Funktionen, die in Funktionen deklariert sind, alte Funktionsdefinitionen. –

Antwort

1

Wie Ihr Code aussehen sollte

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
void myfunction(double x, int y[2], int *d); 

int main(int argc, char **argv) 
{ 
    int a[2]; 
    int *c = malloc(sizeof(int)); 
    double b=10.0; 
    *c = 5; 
    a[0]=1; 
    a[1]=2; 

    printf("before call %f %d %d %d\n",b,a[0],a[1],*c); 
    myfunction(b,a,c); 
    printf("after call %f %d %d %d\n",b,a[0],a[1],*c); 
} 

void myfunction(double x, int y[2], int *d) 
{ 
    double z; 
    x=2*x; 
    y[0]=3*y[0]; 
    y[1]=3*y[1]; 
    *d =*d+2; 
} 

Hinweis, malloc richtige Größe

Arrays starten bei 0

modernen Erklärungen Funktionen

Variablen zum Zeitpunkt der ersten Verwendung erklärt.

Fest prrintf Format (% nicht $)

+2

'int argc,' und 'char ** argv' werden nicht verwendet. Warum 'int main (int argc, char ** argv)' und nicht 'int main (void)'? 'Z' ist unbenutzt. – Michi

+0

@ pm100 Danke –

0

Wie @OliverCharlesworth in seinem Kommentar angibt, ist das Problem hier, dass Sie $d statt %d verwenden. Daher verwendet der Format-String nur das erste Argument a[1]. Ersetzen Sie einfach $d durch %d und Ihr Code sollte gut funktionieren.

Auf einem anderen Knoten. C sind nullindiziert. Sie greifen auf Arrays zu, als wären sie ein Index. Dies führt zu Problemen, wenn Sie auf nicht zugewiesenen Speicher zugreifen. Wenn also int a[2] ein Array deklarieren, sollte es Index mit Zugang 0 und 1 (a[0] und a[1])

ich genommen habe die Freiheit, den Code neu zu schreiben unter:.

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

void myfunction(int x, int* y, int *d); 

int main(int argc, char *argv[]) 
{ 
    double b; 
    int a[2], *c; 


    c = (int*)(malloc(sizeof(c))); 
    b = 10.; 
    *c = 5; 
    a[0] = 1; 
    a[1] = 2; 

    printf("before call %f %d %d %d\n", b, a[0], a[1], *c); 
    printf("before call %f %d %d %d\n", b, a[0], a[1], *c); 
    myfunction(b,a,c); 
    printf("after call %f %d %d %d\n", b, a[0], a[1], *c); 
} 

void myfunction(int x, int * y, int * d) 
{ 
    x = 2 * x; 
    y[0] = 3 * y[0]; 
    y[1] = 3 * y[1]; 
    *d = *d + 2; 
} 
+0

Was ist die Geschichte von 'int argc, char * argv []' hier? – Michi

+0

@Joans Vielen Dank –