int *src = malloc(20 * sizeof(int)); memset(src, 0, 20); // 初始化内存为0 memcpy(src, src + 1, sizeof(int) * 19);为啥会越界,具体解释
时间: 2024-09-12 09:14:00 浏览: 49
论C/C++函数间动态内存的传递
这段代码试图通过`memcpy`操作将数组`src`的第一个元素复制到剩余的19个元素上,但是它存在越界访问的问题。原因在于:
1. `src + 1`计算的是从第一个元素(索引0)跳过一个位置后的地址,即指向第二个元素(索引1)。然而,`memcpy`尝试从这个地址开始复制,直到遇到`sizeof(int) * 19`个整数。
2. 当`src + 1`加上`sizeof(int)`的19次时,它会超出数组的范围。因为数组有20个元素,最后一个元素的索引是19,所以当第20次迭代到达`src[19]`时,`memcpy`实际上会尝试写入数组的未初始化部分,这部分可能属于其他变量或栈上的数据,这在大多数情况下是不允许的,可能导致不可预测的行为甚至程序崩溃。
正确的做法应该是不越过数组边界来复制数据,或者如果目的是填充数组,应该使用`memset`而不是`memcpy`,如原始示例中所示。
修正后的代码(使用`memset`填充数组):
```c
int *src = malloc(20 * sizeof(int));
memset(src, 0, 20 * sizeof(int)); // 初始化整个数组为0
```
阅读全文