2017-02-21 51 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; 
    } 
}