gpt4 book ai didi

c - 用 malloc 初始化字节数组有问题吗?

转载 作者:行者123 更新时间:2023-12-04 11:07:13 25 4
gpt4 key购买 nike

我有一个结构类型 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 中的其他整数,它也不会更改其他 frameBuf[] 中的任何其他 data[k]

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

[编辑]:您可以在以下位置查看代码:http://ideone.com/6BRsU
我在initFrameBuf中初始化frameBuf,将数据赋值给transMessage中的frameBuf,奇怪的输出在 retryTransWindow

[编辑]:解决了。好的,问题不在数组初始化中。这一切都是我在编码方面的笨拙。感谢大家的帮助! ^^

最佳答案

我怀疑 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();
}

关于c - 用 malloc 初始化字节数组有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8095039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com