2012-03-20 2 views
-1

Я хочу получать байты в conbuf.buffer. либо тест 1, либо тест2 в порядке. Я не вижу никакой ценности в выражении printf. Правильно ли я перехожу в указатель? Как распределить память указателю char внутри структуры.Доступ к указателю char в структуре C++ и выделение памяти

typedef struct cBuf 
{ 
    int size; 
    char *buffer; 
} cbuf; 

class A 
{ 
    cbuf conbuf; 
    void test(); 
} 

void A::test() 
{ 
    int buffersize = 20; 
    char buf[buffersize]; 

    conbuf.buffer = (char *)malloc(buffersize * sizeof(char *)); 

    // test 1 
    int n = socket.receivebytes(conbuf.buffer, buffersize); 

    // test 2 
    //int n = socket.receivebytes(buf, buffersize); 
    //strcpy(conbuf.buffer, buf); 

    printf("conbuf.buffer %s \n", conbuf.buffer); 
} 
+1

-1: Можете ли вы опубликовать код, который действительно компилируется? –

+0

Какие точные данные отправляются через сокет? – Mark

+2

Используйте 'std :: vector' вместо распределения памяти вручную. –

ответ

1

этого

conbuf.buffer = (char *)malloc(buffersize * sizeof(char *)); 

должен быть

conbuf.buf = (char *)malloc(buffersize * sizeof(char)); //allocate space for char not pointer to char. Your struct only has buf member not "buffer" 
+1

Правильно, это не решит его проблему. – pezcode

+0

sizeof (char *) всегда больше, чем на sizeof (char). – AgA

1

Используйте это:

conbuf.buffer = (char *)calloc( (buffersize * sizeof(char))+1,1); 

поскольку Printf требует последнего символа строки завершается нулем, это гарантирует его. Но данные, полученные из сети, могут уже содержать NUL в середине. Таким образом, вместо того, чтобы использовать Printf вы должны использовать FWRITE:

fwrite(conbuf.buffer,buffersize , STDOUT); 

Я хотел бы предложить вам, чтобы перенаправить его в файл и сделать дамп, чтобы увидеть результат.

+0

Спасибо AgA! но в тесте 1 conbuf.buffer равен нулю, тогда как в тесте 2 buf в приемах байтов не является нулевым. Поэтому мне интересно, если это связано с неправильным указателем где-то? Правильно ли распределено память? Я изменил его на тот, который вы упомянули. – swap

+1

Если вы не дадите код, я не могу комментировать, так как ваше заявление сбивает с толку. calloc никогда не будет возвращать значение null, если не исчерпана вся память. Также буферизация должна быть объявлена ​​как const int, так как для объявления массива размер должен быть в стоимости в большинстве реализаций C++. – AgA

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