2015-10-17 3 views
0

Я пытаюсь выделить память и обнулить ее для структуры отправителя, но я не уверен, что я делаю это правильно. Я пытаюсь научиться управлять памятью на C, пока я делаю этот проект. Как я могу проверить его, чтобы посмотреть, на что я настроил память? И будет ли то, что я пытаюсь сделать, или есть лучший способ сделать это?Как выделить память структуры?

typedef unsigned char uchar; 

typedef struct { 
    uchar Seq; 
    uchar Ack; 
    uchar Flags; 
} Header; 

#define FRAME_PAYLOAD_SIZE 50 
struct Frame_t 
{ 
    Header header; 
    char data[FRAME_PAYLOAD_SIZE]; 
    uchar CRC; 
}; 
typedef struct Frame_t Frame; 

struct Sender 
{ 
    uchar winSize; 

    struct sendSlot { 
     struct timeval timeout; 
     Frame msg; 
    } sendQ[5]; 
}; 


    initSend(Sender* sender) { 
     sender->winSize = -1; 

     char* send_buf = (char*) malloc(5 * sizeof(sender->sendQ[0])); 
     memset(send_buf, 0, 5 * sizeof(sender->sendQ[0])); 
     int i; 
     for (i=0; i<sizeof(sender->sendQ)/sizeof(sender->sendQ[0]); i++) { 
      memset(sender->sendQ[i].timeout, 0, sizeof(struct timeval)); 
      sender->sendQ = NULL; 
     } 
    } 
+1

Вы пытаетесь определить функцию внутри 'main()'? Если да, остановитесь прямо там. – EOF

+2

Просто используйте '' calloc' '(http://linux.die.net/man/3/calloc) вместо 'malloc', и вы начнете с обнуленной памяти. Задача решена! – DaoWen

+0

@EOF нет, главное здесь не важно, initSend() может быть в любом другом файле. – Urler

ответ

0

sendQ является членом массива Sender, это не указатель. Нет необходимости выделять память с помощью malloc. Вы можете использовать:

initSend(Sender* sender) { 
    sender->winSize = -1; 
    memset(sender->sendQ, 0, sizeof(sender->sendQ)); 
} 
+0

Я вижу, спасибо. – Urler

+0

Почему не просто 'void initSend (отправитель * отправитель) {Sender s = {.winSize = -1}; * sender = s; возвращение;} '? – EOF