2011-11-11 18 views
3

我有一个结构类型,MESGB与细节:用malloc初始化Byte数组有问题吗?

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]。数据[0] ,所有其他frameBuf [j] .data [0]也会改变,这让我感到不安。即使如果我改变数据[k]中的数据,其中k是0的其他整数,它不会改变其他frameBuf中的任何其他数据[k]

有人可以向我解释如何解决这个问题吗? 在此先感谢! :d

将帖子: 可以看到的代码:http://ideone.com/6BRsU
我在transMessage, 初始化frameBuf在initFrameBuf, 分配数据到frameBuf和奇怪输出处于retryTransWindow

将帖子: 解决。好的,问题不在于数组初始化。这一切都是我在编码方面的笨拙。 感谢您的帮助! ^^

+0

您需要展示如何分配'.data'字段。 – Cheeso

回答

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(); 
} 
+0

maxElmt在我的代码是一个常量,我不能在malloc中使用它? –

+0

它必须至少为3,否则会遇到分配'framebuf [k] .data [2]'的问题。 (你会写入未分配的内存) – Cheeso

+0

是的,你可以在'malloc'中使用任何表达式,但是当我看到你的代码时你需要一个更大的'maxElmt' –

1

maxElmt足够大(特别是它> = 4)?

你尝试了所有警告编译程序和调试启用-Wall -g(假设gcc兼容的编译器),以提高它,直到你有没有更多的警告,并使用调试器(如gdb)进行调试?

+0

不,maxElmt是3,当我将它改为4时,输出变得更奇怪:数据中有问题的索引现在是0和1,而不仅仅是0 –

+0

什么是字节类型。我认为每个人都在使用它的无符号字符,但也许你还有别的东西?或者只是你的任务或输出代码中的一个错误。也许你可以发布你的代码(或者至少是出现问题的部分),在这里或http://ideone.com – Sodved

+0

哦,是的,对不起,我没有把这个:typedef unsigned char Byte; –