使用malloc初始化Byte数组是有问题的吗?

时间:2011-11-11 14:01:58

标签: c bytearray

我有一个结构类型,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]也会改变,我发现令人不安。即使我改变数据[k]中的数据,其中k是0中的其他整数,它也不会改变其他frameBuf中的任何其他数据[k] []

有人可以向我解释如何解决这个问题吗? 提前致谢! :d

[被修改]: 您可以在http://ideone.com/6BRsU中看到代码 我在initFrameBuf中初始化frameBuf, 在transMessage中将数据分配给frameBuf, 而奇怪的输出是在retryTransWindow

[被修改]: 解决了。好的,问题不在于数组初始化。 所有这些都是我编码的笨拙。 感谢您的所有帮助! ^^

2 个答案:

答案 0 :(得分:2)

我怀疑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 :(得分:1)

maxElmt是否足够大(特别是&gt; = 4)?

您是否尝试使用所有警告编译程序并启用调试-Wall -g(假设gcc兼容编译器),改进它直到您不再收到警告,并使用调试器进行调试(比如gdb)?