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

附注如果将TIME_PEOPLE改为8,则意味着我们需要复制3次才能填满info

最佳答案

考虑当偏移量增加到 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);

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

关于c - 函数 'memcpy' 的警告可能数据溢出是如何发生的以及如何修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17281888/

相关文章:

javascript - 排序超过 10 行的 HTML 表格不起作用

c - memcpy() 具有不同的数据类型

mysql - C Realloc 追加字符串 MySQL 连接器

C:使用 memcpy 分配结构

使用可变参数和后期扩展创建字符串化宏参数列表

c - 如何在 C99 中迭代 char*?

C 内在函数、SSE2 点积和 gcc -O3 生成的程序集

c++ - 在什么情况下应该使用匿名枚举?

java - 如何通过在文本字段中输入编号来创建数组,Java 小程序

javascript - 如何使用 jQuery 将文本与数组匹配?