Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用malloc初始化字节数组有问题吗?_C_Bytearray - Fatal编程技术网

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

用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

我有一个结构类型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[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
字段。