2016-02-12 116 views
-2

我剛剛開始學習C代碼,我已經給出了一個練習來創建兩個函數,您可以在我的代碼中看到createData()udskriv(),其中createData應該創建一個數組使用用戶輸入,並且udskriv方法應該使用指針來打印它。C:通過指針打印數組給出錯誤的數字

但是,我的代碼只給了我1或2的正確數字,然後通常打印時爲0和一個非常高的數字(如10位數字)。通過運行main方法中的循環,我能夠通過無功能的方式實現它,但我無法使它與它們一起工作。

我有一些Java的經驗,這可能會幫助你解釋爲什麼我做錯了什麼。

#include <stdio.h> 

static int* createData() 
{ 
    int test[4]; 
    int c; 
    int *ptr; 

    printf("Indtast 4 tal, 1 af gangen"); 
    for (c = 0; c < 4; c++) 
    { 
     scanf("%d", &test[c]);  
    } 

    ptr=&test; 
    return (ptr); 
} 

static void udskriv(int* ptr) 
{ 
    int i; 
    for (i=0;i<4;i++) 
    { 
     printf("%d\n",*ptr++); 
    } 
} 

int main(void) 
{ 
    udskriv(createData()); 
} 
+0

你在看哪本書?你無法通過反覆試驗來學習C;這樣做可能具有誤導性和危險性,而且您這樣做是錯誤的這一事實應該證明試驗和錯誤不起作用。你注意到這個問題其實是一個好結果;很多時候,人們在通過反覆試驗學習時都沒有注意到問題。如果你還沒有書,我可以爲你推薦K&R 2E。 – Sebivor

+0

btw他是對的:_我對Java有一些經驗_解釋他的錯:___不像Java__那樣使用C!他們使用完全不同的數據處理! – LittleByBlue

回答

2

您正在返回一個指向本地數據的指針。函數createData中的變量test是一個局部變量,其技術上稱爲「存儲類自動」。當函數返回時,用於test的內存可能用於其他目的。

1

您不能返回指向本地變量的指針。當函數退出時,局部變量被破壞。或者:

  • 傳中的函數調用
  • 的malloc你要返回數組的緩衝區(和調用者必須釋放它)
0

現在,它的工作原理。我爲變量(測試)添加了內存分配,並修改了函數createData的返回行。初始代碼不起作用的原因是(test)是一個局部變量,在退出函數createData後將被銷燬。

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

static int* createData() 
{ 

     int *test; 

    int c; 
    int *ptr; 

    test = malloc(4*sizeof(int)); 

    printf("Indtast 4 tal, 1 af gangen\n"); 
    for (c = 0; c < 4; c++) 
    { 
     scanf("%d", &test[c]);  
    } 

    ptr=test;  /* ptr=&test is not ok. ---> test is already the address you need ---> if you want, you can do this ptr=&test[0] and it's ok */ 
    return (ptr); 
} 

static void udskriv(int* ptr) 
{ 
    int i; 
    for (i=0;i<4;i++) 
    { 
     printf("%d\n",*ptr++); 
    } 
} 

int main(void) 
{ 
    udskriv(createData()); 
    return 0; 
}