0

我有以下代码:

#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,那么这个警告是如何发生的以及如何修复它?

PS如果TIME_PEOPLE改成8,这意味着我们需要复制3次才能填满info

4

2 回答 2

0

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

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

于 2013-06-24T18:29:53.770 回答
0

考虑一下当 offset 增加到 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);

但是如果不确切知道您要做什么,就很难说。我只知道你目前实施的没有任何意义。

于 2013-06-24T19:30:13.227 回答