用malloc初始化字节数组有问题吗?
我有一个结构类型MESGB,详细信息如下:用malloc初始化字节数组有问题吗?,c,bytearray,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
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[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[]中的任何其他数据[k]
有人能给我解释一下如何解决这个问题吗?
提前谢谢!:D
[已编辑]:
您可以在中看到代码:我在initFrameBuf中初始化frameBuf, 将数据分配给transMessage中的frameBuf, 奇怪的输出在retryTransWindow中 [已编辑]: 解决了的。好的,问题不在数组初始化中。 所有这些都是我在编码方面的笨拙。
谢谢你的帮助^^ 我怀疑
maxelt
不是你想象的那样
我得到这个输出:
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();
}
typedef无符号字符字节;
类型定义结构MESGB\T
{
无符号整数soh;
无符号整数stx;
无符号整数etx;
字节校验和;
字节msgno;
字节*数据;
}MESGB;
#定义尺寸6
#定义maxelt3
静态MESGB frameBuf[buffSize];
字节curChar=97;
void Init()
{
int k,i;
对于(k=0;k是否maxElmt
足够大(尤其是它是否>=4)
您是否尝试在编译程序时使用所有警告并启用调试功能-Wall-g
(假设使用兼容的gcc
编译器),以改进程序直到不再收到警告,并使用调试器(如gdb
)对其进行调试?它必须至少为3,否则您将在分配framebuf[k]时遇到问题。数据[2]
(您将写入尚未分配的内存)是的,你可以在malloc
中使用任何表达式,但是你需要一个更大的maxElmt
当我看到你的代码时,我看不出在初始化frameBuf时与我的有什么不同,但是为什么我会得到不同的输出呢?事实上,我上面发布的代码与我遇到这个问题时的代码并不完全相同,它非常复杂。我会做更多的分析那么分析一下,问题可能出在其他地方。谢谢你的帮助!:d指针错误就是这样表现出来的。可能是你踩着.data
,指向malloc空间的指针丢失了。等等。不,maxelt是3,当我把它改成4时,输出变得更奇怪:数据I中有问题的索引s现在是0和1,而不仅仅是0,字节的类型是什么。我想每个人都假设它是无符号字符,但可能你还有其他原因?或者只是你的赋值或输出代码中有一个错误。也许你可以发布你的代码(或者至少是存在问题的部分代码),在这里或上哦,是的,很抱歉我没有放:typedef unsigned char Byte;您需要显示如何分配.data
字段。