2013-06-24 60 views
0

我有以下代码:警告如何发生警告函数'memcpy'发生可能的数据溢出,以及如何解决它?

#define NUM_PEOPLE 20 
#define TIME_PEOPLE 10 
typedef struct 
{ 
    int name; 
    int age; 
} People 

typedef struct 
{ 
    int number; 
    int post; 
} Contact; 

typedef struct 
{ 
     int    number; 
     Pepole   people[TIME_PEOPLE][NUM_PEOPLE]; 
     Contact   contact[NUM_PEOPLE]; 
} Master; 

typedef struct 
{ 
     int    number; 
     People   people[NUM_PEOPLE][NUM_PEOPLE]; 
     Contact   contact[NUM_PEOPLE]; 
} Info; 

Info info; 
Master master; 

int counter = 1 
int size; 
int offset = 0; 

while(counter > 0) 
{ 

     size = TIME_PEOPLE; 

     if(counter == 1) 
     { 
    size = NUM_PEOPLE - (TIME_PEOPLE * (offset + 1)); 
     } 

     memcpy(&info.people[TIME_PEOPLE + TIME_PEOPLE * offset][0], &master.people[0][0], 
     sizeof(People) * size * NUM_PEOPLE); 
     offset ++; 
     counter --; 
} 

,但我得到了以下警告:

Warning 669: Possible data overrun for function 'memcpy(void *, const void *, unsigned int)', argument 3 , 

我做了这个代码,因为NUM_PEOPLE可能被更改为小于TIME_PEOPLE,那么此警告的发生,如何解决它?

P.S.如果TIME_PEOPLE更改为8,这意味着我们需要复制三次才能填满info

+0

不知道它是否会引起您的警告,但有两个明显的问题:'人'拼写错误'Master'结构声明,并且'offset'从未设置(您应该得到“set before set”警告)。一般来说,我倾向于使用'memmove()'而不是'memcpy()'。 –

+0

我修改了偏移部分,初始值为0 – user2131316

+0

这个确切的代码和问题在其他文章中被询问和回答。必须是作业分配... – 2013-06-24 18:54:25

回答

0

考虑当偏移量递增到1时会发生什么。该参考文献:

&info.people[TIME_PEOPLE + TIME_PEOPLE * offset][0] 

转化为这样:

&info.people[20][0] 

而且由于info.people阵列只有NUM_PEOPLE(即20)的元件,在已经过去的指向结束。

鉴于当前编写代码的方式,因为循环只执行一次,所以永远不会发生,但编译器可能没有考虑到这一点。如果仅仅执行一次循环,那么循环的意义是什么?偏移量只会是零?

在我看来像数组引用真的应该已经:

&info.people[TIME_PEOPLE * offset][0] 

大小计算应该是:

size = NUM_PEOPLE - (TIME_PEOPLE * offset); 

,计数器也许应该被初始化为这样的事情:

int counter = ceil((float)NUM_PEOPLE/TIME_PEOPLE); 

但是很难说不知道wha你正在尝试做什么。我只知道你目前实施的内容没有任何意义。

+0

但可以删除警告? – user2131316

+0

@ user2131316也许吧。我建议你试试看看。我的编译器不会对原始代码产生警告,所以我只能猜测你的编译器会做什么。 –

+0

@ user2131316你能摆脱那个警告吗? –

0

'offset'的值是多少?您正在使用10 + 10 *偏移量作为目的地的基地址。它看起来像info.people []只有20个开始。

另外,10 + 10 *偏移量可以计算为10+(10 *偏移量)。安全:使用(10 + 10)*偏移量

+0

可以计算为?它当然更好,或编译器坏了。 –

+0

我不知道你在用什么样的编译器。有破碎的编译器。 – 2013-06-24 18:43:28