2012-03-02 2 views
0

У меня есть такая структура, как следующее:передавая указатель на инициализированную структуру в функции

typedef struct{ 
char static_data[10]; 
int a; 
int b; 
} my_ds; 

я настрою его как следующее:

my_ds * ds = (my_ds *)malloc(sizeof(my_ds)); 
memmove(my_ds->static_data, buf, len); 
ds->a = c; 
ds->b = d; 

и передал его в функции:

int my_fun(void ** data); 
my_fun((void *)&ds); 

Что происходит внутри my_fun, первое поле, статическое [10] инициализировано правильно, но другие два значения равны нулю. Что мне здесь не хватает?

+1

'символ статического [10]'? Как вы объявили поле под названием 'static' 0.o? – cnicutar

+0

извините за это, исправил его. – CodeBladeRunner

+0

Насколько велик 'len'? – cnicutar

ответ

0

memmove()? Я предполагаю, что вы намеревались использовать memcpy() или strcpy() или, возможно, даже strncpy()!

Также двойные ** (возможно) не нужны в my_fun(void **data) Указатель void может указывать на что угодно, включая указатель на пустоту. (но это зависит от определения функции, которое не было показано)

В этом случае амперсанд (или литой) в my_fun ((void**) &ds); также не требуется. любой указатель может быть приведен в указатель пустот в C.

my_ds * ds; 
ds = malloc(sizeof *ds); 
if (len >= sizeof my_ds->static_data) len = sizeof my_ds->static_data - 1; 
memcpy(my_ds->static_data, buf, len); 
my_ds->static_data[len] = 0; 
ds->a = c; 
ds->b = d; 
+0

что случилось с 'memmove()'? Это просто «memcpy()», который знает, как справляться с перекрывающимися буферами. –

+0

технически, в этом нет ничего плохого. Но в этом случае буферы не могут перекрываться, поэтому memmove() не требуется. Аргумент len по-прежнему является потенциальным вектором ошибок, независимо от функции, используемой для копирования. – wildplasser

+0

1. Вы правы относительно вещи * void ***. Я должен был заметить. Я буду запускать ваши предложения и публиковать обновления. Благодарим за комментирование – CodeBladeRunner

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