инициализация байтового массива с помощью malloc проблематична? - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть тип структуры, MESGB с деталями:

typedef unsigned char Byte; 
typedef struct MESGB 
{ 
unsigned int soh; 
unsigned int stx; 
unsigned int etx; 
Byte checksum; 
Byte msgno; 
Byte *data; 
} MESGB; 

и у меня есть переменная с именем frameBuf, которая является массивом MESGB:

#define buffSize 6
#define maxElmt 3
static MESGB frameBuf[buffSize]

когда я хочу инициализировать frameBuf с помощью этой функции:

int k;
for(k = 0; k<=buffSize-1; k++)
{
    frameBuf[k].soh = SOH;
    frameBuf[k].stx = STX;
    frameBuf[k].etx = ETX;
    frameBuf[k].checksum = 0;
    frameBuf[k].msgno = -1;
    frameBuf[k].data = (Byte*) malloc (maxElmt*sizeof(Byte));               
}

Что я нашел странным, так это то, что если я записываю значение в данные frameBuf следующим образом:

frameBuf[0].data[0] = 'a'
frameBuf[0].data[1] = 'b'    
frameBuf[0].data[2] = 'c'
frameBuf[1].data[0] = 'd'
frameBuf[1].data[1] = 'e'    
frameBuf[1].data[2] = 'f'
frameBuf[2].data[0] = 'g'
frameBuf[2].data[1] = 'h'    
frameBuf[2].data[2] = 'i'

когда я пытаюсь распечатать все данные frameBuf, я получаю вывод, подобный этому:

frameBuf[0].data[0] = 'g'
frameBuf[0].data[1] = 'b'    
frameBuf[0].data[2] = 'c'
frameBuf[1].data[0] = 'g'
frameBuf[1].data[1] = 'e'    
frameBuf[1].data[2] = 'f'
frameBuf[2].data[0] = 'g'
frameBuf[2].data[1] = 'h'    
frameBuf[2].data[2] = 'i'

и я пришел к выводу, что если я изменю значение frameBuf [i] .data [0], все другие frameBuf [j] .data [0] также изменятся, что я нахожу тревожным. Даже если я изменю данные в data [k], где k - другое целое число в 0, это не изменит никаких других данных [k] в другом frameBuf []

Может кто-нибудь объяснить мне, как решить эту проблему? Заранее спасибо! : D

[Изменено]: Вы можете увидеть код в: http://ideone.com/6BRsU
Я инициализирую frameBuf в initFrameBuf, назначить данные для frameBuf в transMessage, и странный вывод в retryTransWindow

[Изменено]: Решаемые. Хорошо, проблема не в инициализации массива. Все это моя неуклюжесть в кодировании. Спасибо за вашу помощь! ^^

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Я подозреваю, maxElmt не то, что вы думаете.

Я получаю этот вывод:

frameBuf[0].data[0]='a'
frameBuf[0].data[1]='b'
frameBuf[0].data[2]='c'

frameBuf[1].data[0]='d'
frameBuf[1].data[1]='e'
frameBuf[1].data[2]='f'

frameBuf[2].data[0]='g'
frameBuf[2].data[1]='h'
frameBuf[2].data[2]='i'

frameBuf[3].data[0]='j'
frameBuf[3].data[1]='k'
frameBuf[3].data[2]='l'

frameBuf[4].data[0]='m'
frameBuf[4].data[1]='n'
frameBuf[4].data[2]='o'

frameBuf[5].data[0]='p'
frameBuf[5].data[1]='q'
frameBuf[5].data[2]='r'

... используя этот код:

typedef unsigned char Byte;

typedef struct MESGB_T
{
    unsigned int soh;
    unsigned int stx;
    unsigned int etx;
    Byte checksum;
    Byte msgno;
    Byte *data;
} MESGB;

#define buffSize 6
#define maxElmt 3

static MESGB frameBuf[buffSize];

Byte curChar = 97;

void Init()
{
    int k, i;
    for(k = 0; k<=buffSize-1; k++)
    {
        frameBuf[k].soh = 23; // SOH;
        frameBuf[k].stx = 24; // STX;
        frameBuf[k].etx = 25; //ETX;
        frameBuf[k].checksum = 0;
        frameBuf[k].msgno = -1;
        frameBuf[k].data = (Byte*) malloc (maxElmt*sizeof(Byte));
        for (i=0; i < maxElmt; i++)
        {
            frameBuf[k].data[i]=curChar++;
        }
    }
}

void Print()
{
    int k, i;
    for(k = 0; k<=buffSize-1; k++)
    {
        for (i=0; i < maxElmt; i++)
        {
            printf("frameBuf[%d].data[%d]='%c'\n",
                   k,i, frameBuf[k].data[i]);
        }
        printf("\n");
    }
}

int main(int argc, char **argv)
{
    Init();
    Print();
}
1 голос
/ 11 ноября 2011

Является ли maxElmt достаточно большим (в частности,>> 4)?

Вы пытались скомпилировать вашу программу со всеми предупреждениями и включенной отладкой -Wall -g (предположим, gcc совместимый компилятор), улучшать ее до тех пор, пока у вас больше не будет предупреждений, и отлаживать ее с помощью отладчика (например, * 1006) *)

...