打印数组副本时出现分段故障



以下程序在打印v2时出错,但在阵列复制期间未出错。有人知道为什么吗?

#include <stdio.h>
#include <stdlib.h>
void cpyarray (void* dst, void* src, size_t memsize, size_t size) {
    for (size_t i = 0; i < size; i++) {
        *(((char*) dst) + i*memsize) = *(((char*) src) + i*memsize);
    }
}
int main () {
    size_t N = 10;
    double* v1 = (double *) malloc(N * sizeof(double));
    double* v2 = (double *) malloc(N * sizeof(double));
    for (size_t i = 0; i < N; i++) *(v1+i) = i;
    printf("nnv1: ");
    for (size_t i = 0; i < N; i++) printf("%g ", v1[i]);
    cpyarray(&v2, &v1, sizeof(double), N);
    printf("nnv2: ");
    for (size_t i = 0; i < N; i++) printf("%g ", v2[i]); // program crashes here
    return 0;
}

EDIT:如果我复制ints而不是doubles的数组,代码不会崩溃。

v1v2是指向要操作的内存块的指针。但您将它们的地址传递给cpyarray函数。

所以你在错误的内存块上操作,在v2变量周围踩内存,并更改v2指向的内容。

cpyarray(v2, v1, sizeof(double), N);

您正在将&v2传递给cpyarray(),这意味着您的函数正在更改v2指向的位置!由于它现在指向一个无效的位置,因此在为printf()取消引用它时会出现seg错误。

相反,只需将v2传递给cpyarray()

您向cpyarray函数传递了错误的指针。

您的代码发送指向数组的指针(指向双指针的指针)

cpyarray(&v2, &v1, sizeof(double), N);

您应该发送数组(指针指向双)

cpyarray(v2, v1, sizeof(double), N);

除了当前答案指出的问题外,cpyarray并没有复制数组,只是复制它的某些部分。与其试图用i*memsize模仿类型,不如将内存块视为一堆字节,并逐个复制。现在你所要做的就是计算出要复制多少字节,这并不难。

相关内容

  • 没有找到相关文章

最新更新