如何警告函数'可能的数据溢出;memcpy';发生了什么,如何修复?

如何警告函数'可能的数据溢出;memcpy';发生了什么,如何修复?,c,arrays,memcpy,C,Arrays,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_PEO

我有以下代码:

#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\u PEOPLE
可以更改为小于
TIME\u PEOPLE
,那么此警告是如何发生的,以及如何修复它


另外,如果将时间更改为8,这意味着我们需要复制三次来填充信息,偏移量的值是多少?您正在使用10+10*偏移量作为目标上的基址。它看起来像是信息。人物[]刚开始只有20岁


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

考虑当偏移量增加到1时会发生什么。此参考:

&info.people[TIME_PEOPLE + TIME_PEOPLE * offset][0]
换言之:

&info.people[20][0]
由于
info.people
数组只有
NUM\u people
(即20个)元素,因此该元素已经指向末尾

考虑到当前编写代码的方式,这种情况永远不会发生,因为循环只执行一次,但编译器可能不会考虑这一点。如果循环只执行一次,而偏移量只为零,那么循环有什么意义呢

在我看来,数组引用应该是:

&info.people[TIME_PEOPLE * offset][0]
size = NUM_PEOPLE - (TIME_PEOPLE * offset);
尺寸计算应为:

&info.people[TIME_PEOPLE * offset][0]
size = NUM_PEOPLE - (TIME_PEOPLE * offset);
计数器可能应该被初始化为如下内容:

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

但是如果不知道你到底想做什么,很难说。我只知道您当前所实现的没有任何意义。

不确定是否是它导致了您的警告,但有两个明显的问题:
人员在您的
Master
结构声明中拼写错误,
offset
从未设置(您应该得到“设置前使用”警告)。不过,一般来说,我倾向于使用
memmove()
而不是
memcpy()
。我修改了偏移部分,初始值是0。这个确切的代码和问题会在其他帖子中询问和回答。必须是家庭作业…不,不是,警告不同,也不是家庭作业可以计算为?它当然更好了,或者编译器坏了。我不知道你用的是哪种编译器。有坏的编译器。但这能删除警告吗?@user213136可能。我建议你试试看。我的编译器不会用原始代码生成警告,因此我只能猜测编译器会做什么。@user213136您能消除该警告吗?