考虑以下C代码:
#define SIZE_A // >= SIZE_B
#define SIZE_B
#define SOME_SIZE // > SIZE_B
int main() {
int a[SIZE_A];
int b[SIZE_B] = {0};
memcpy(a, b, sizeof(int)*(SOME_SIZE));
return 0;
}
假设SIZE_A,SIZE_B是一些整数,SOME_SIZE> SIZE_B和SIZE_A> = SIZE_B。 如果:
会产生什么后果a. SOME_SIZE < SIZE_A
b. SOME_SIZE = SIZE_A
c. SOME_SIZE > SIZE_A
我试图用一些值运行它,但不知道是否有任何常量。 感谢
答案 0 :(得分:6)
在您的情况下(因为您要复制a
和b
的地址并开始),它必须保持SOME_SIZE <= SIZE_A
AND {{1 }}否则它是https://docs.djangoproject.com/en/1.9/topics/pagination/。
简单来说,从源到目标复制的字节数绝不应该更多,而不是从指定给{的源和目标地址开始的可用字节{1}}。例如,如果您要从数组SOME_SIZE <= SIZE_B
的中间复制,则必须缩小memcpy
的范围 - 从b
的中间开始可用的字节数比SOME_SIZE
更少。
答案 1 :(得分:1)
您应该只从已声明的区域复制到您声明的区域。这意味着只要SOME_SIZE > SIZE_B
调用未定义的行为。
现在常见的实现会发生什么:
ab)SOME_SIZE <= SIZE_A
:如果你没有达到任何段限制,这意味着尝试从不可读的内存中读取,你只需要在a
的内容之后将垃圾复制到b
的末尾。 - 但如果你属于不可读的内存,你将收到内存违规信号。
c)SOME_SIZE > SIZE_A
:除了读取未定义内存的问题外,还要将它写在某个你不知道的地方。这里可能会发生非常糟糕的事情:
TL / DR:因为它本质上是未定义的行为,所发生的只是,嗯,未定义
答案 2 :(得分:-3)
您正在复制b变量之后的数据,在这种情况下,b变量将是随机堆栈内容。你不会看到任何恒定因为它是未定义的。好消息(或坏消息,取决于你如何看待它)是它到目前为止还没有崩溃。如果你的SOME_SIZE是巨大的,那么我认为你可能会在某些平台上崩溃。