2013-12-13 3 views
1

У меня есть две функции, и я пытаюсь передать буфер от одной функции к другой и изменить ее содержимое, но я не могу заставить ее работать. что у меня есть:Передача char * назад и вперед между функциями

void caller() 
{ 
    char * datum; 
    populate (&datum); 
} 

void populate (void * buf) 
{ 
    unsigned char * datump; 
    int dtsz; 
    getData (datump,dtsz); // This function puts "001" in datump and dtsz = 4 

    buf = new unsigned char[dtsz]; 
    memset(datumbuf,0,sizeof(buf)); 
    memcpy (buf,datump,dtsz); 

} 

Когда я отлаживаю все, кажется, что это точно так, как должно быть, пока я не доберусь до memcpy. Кажется, что memcpy ничего не делает. Причина «datumbuf = new unsigned char [dtsz]» выполняется потому, что функция getData() «возвращает каждый раз с другим размером в зависимости от размера данных, поэтому размер не может быть статически назначен.

Когда я вернусь к основной функции «caller()», в «datum» есть мусор.

Любые идеи, почему это происходит и как это можно исправить?

Благодаря

+0

населенный пункт не использовался buf. – BLUEPIXY

+0

Во-первых, 'sizeof (buf)' - размер указателя, а не размер выделенной памяти. Во-вторых, присвоение 'buf' будет влиять только на локальную копию, вызывая утечку памяти. Если вы планируете исправить это, установив параметр 'void **', чтобы вы могли назначить '* buf', вы не сможете в неявном порядке передать символ' char ** '. – chris

+0

Прежде всего, 'void * buf' должен быть' char ** buf'. Во-вторых, ваша функция не использует 'buf' вообще! – pvgoran

ответ

2

Это не C++, это C. Использование std::string и забыть о таких буферов, если вы используете C++.

Вы не изменяете buf в populate. Вы не выделяете память для datump (не знаете, что делает getData).

1

Эта строка memset странная и неправильная, sizeof(datumbuf) - размер указателя (4 или 8), а не длина массива. Если его 8, он будет писать над другим материалом, так как массив, который вы описываете, всего 4 длины. Тем не менее, я сомневаюсь, что это ваша фактическая ошибка.

2

Ваш populate функция должна только указатель. таким образом все намного проще.

char * populate() 
{ 
    ... 
    buf = new unsigned char[dtsz]; 
    ... 
    return buf; 
} 

... и тогда вы называете это так:

char * datum = populate() 

ваш текущий код не работает, потому что вы путать между параметрами значения и ссылки. Вы передаете datum 'by reference' populate(&datum), но `populate рассматривает его как параметр значения.

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