2017-02-21 12 views
-3

Функция func принимает параметр void buf. Я хочу вставить значения от 1 до 10 в buf, позвонив по номеру func. Однако адреса buf отличаются от func и main, а печатные значения не от 1 до 10. Может ли кто-нибудь помочь мне с этой проблемой? Благодаря!c функция с параметром 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 принимает значение void parameter 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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^