2017-05-10 166 views
-6

我有這樣的代碼不正確的結果在C代碼

#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; 
} 

當我執行它,我收到此

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

我期望能獲得5在第一和第二個電話和7在最後一次通話,也沒有顯示[i] 。 可以請你告訴我爲什麼? 謝謝

+2

''%,不''$​​ ... –

+2

'C =(INT *)(malloc的(1)); [...] * c = 5;'越界訪問,未定義的行爲。 – EOF

+1

此FWIW此代碼是超級非慣用 - 在同一行上聲明的不同類型的變量,在函數內聲明的函數,舊式函數定義。 –

回答

1

如何使你的代碼看起來應該

#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; 
} 

注意,malloc的正確尺寸

陣列啓動at 0

函數的現代聲明

在首次使用時聲明變量。

固定prrintf格式(%不$)

+2

'int argc,'和'char ** argv'沒有被使用。爲什麼'int main(int argc,char ** argv)'而不是'int main(void)'? 'Z'未使用。 – Michi

+0

@ pm100謝謝 –

0

正如@OliverCharlesworth在他的評論中指出的,這裏的問題是您使用$d而不是%d。由於這個格式字符串只使用第一個參數a[1]。只需將$d替換爲%d,您的代碼應該可以正常工作。

在另一個節點上。 C是零索引的。您正在訪問數組,就好像它們是單索引一樣。這會導致您在某些時候遇到問題,因爲您正在訪問未分配的內存。聲明數組int a[2]這樣的情況下,應使用指數01訪問它(a[0]a[1]

我已經採取了自由改寫如下代碼:

#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

'int argc,char * argv []'這裏有什麼故事? – Michi

+0

@Joans謝謝 –