我有一个结构类型,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
[被修改]: 解决了。好的,问题不在于数组初始化。 所有这些都是我编码的笨拙。 感谢您的所有帮助! ^^
答案 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
)?