2017-02-21 17 views
-3

関数funcは、voidパラメータbufをとります。私はfuncと呼んでbufに1から10までの値を挿入したいと思います。ただし、bufのアドレスはfuncmainで異なり、印刷される値は1〜10ではありません。誰でもこの問題を解決できますか?ありがとう!voidパラメータを持つ関数

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は、パラメータbufを無効にします" - いいえ、それはありません! 'buf'は' void * 'であり、' void'ではありません。そしてあなたの 'main'署名は' int main(void) 'でなければなりません。なぜあなたのコンパイラーはあなたを助けてくれませんか?本当に必要ない場合は、 'void *'を使わないでください。キャストにも同じ。タイプセーフなコードを書くと、それ以外のものはメンテナンスの悪夢です。 – Olaf

答えて

2

あなたがスタック(即ちmy_array)上のメモリを指すポインタをbufを設定します。プログラムが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

どうすればfunc(int n、void * buf)を使って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; 
    } 
} 
関連する問題