我有以下代码:
#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/