2017-02-21 100 views
-3

函數func需要void參數buf。我想通過調用func將1到10的值插入buf。但是,的地址在funcmain中有所不同,打印的值不是從1到10.有誰能幫我解決這個問題嗎?謝謝!具有void參數的c函數

void func(int n, void *buf); 

int main() 
{ 
    void *buf; 
    func(10,buf); 
    for(int i=0;i<10;i++){ 
     printf("%d\n", ((char*)buf)[i]); 
    } 
    printf("in main, after func: %p\n",buf); 
} 

void func(int n, void *buf) 
{ 
    (char*)buf; 
    char my_array[n]; 

    for(int i=0;i<n;i++){ 
     my_array[i]=i; 
    } 

    buf = my_array; 
    printf("in func: %p\n",buf); 
} 
+0

「函數func需要void參數buf」 - 不,它不會! 'buf'是一個'void *',而不是'void'(不管那會是什麼)。而你的'main'簽名應該是'int main(void)'。你爲什麼讓你的編譯器不能幫助你?如果沒有必要,請不要使用'void *'。演員陣容也一樣。編寫類型安全的代碼,其他任何事情都是維護的噩夢。 – Olaf

回答

2

您設置buf到指向存儲器堆棧(即my_array)上的指針。由於程序離開func後不再有效,這不起作用。

要麼使用動態內存,但你需要明確地釋放它。另一種方法是外創建內存和唯一填充它的func內:從除

#include <stdio.h> 

void func(char* buf, int n) 
{ 
    for(int i = 0; i < n; i++) { 
     buf[i]=i; 
    } 
} 

int main() 
{ 
    char buf[10]; 
    func(buf, sizeof(buf)); 

    for(int i=0; i < sizeof(buf); i++) { 
     printf("%d\n", buf[i]); 
    } 
} 

:切勿使用void*,除非你有一個很好的理由吧!

+0

所以我如何插入值與buf與func(int n,void * buf)? – Meng

+0

@Meng看到編輯 – koalo

+0

其實他沒有回報。 – immibis

0

你需要在你的函數之外分配你的內存,否則當你返回時它不會有效,因爲它被分配在堆棧上。

void func(int n, int *buf); 

int main() 
{ 
    const int n = 10; 
    int my_array[n]; 

    func(n, my_array); 
    for(int i = 0; i < n; i++){ 
     printf("%d\n", ((int*)my_array)[i]); 
    } 
    printf("in main, after func: %p\n", my_array); 
} 

void func(int n, int *buf) 
{ 
    for(int i = 0; i < n; i++){ 
     buf[i] = i; 
    } 
}