打印数组副本时出现分段错误

时间:2012-08-26 17:35:44

标签: c++ c arrays segmentation-fault

以下程序在打印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("\n\nv1: ");
    for (size_t i = 0; i < N; i++) printf("%g ", v1[i]);

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

    printf("\n\nv2: ");
    for (size_t i = 0; i < N; i++) printf("%g ", v2[i]); // program crashes here

    return 0;
}

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

4 个答案:

答案 0 :(得分:2)

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

因此,您在错误的内存块上操作,踩着v2变量周围的内存,并更改v2指向的内容。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您将错误的指针传递给cpyarray函数。

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

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

你应该发送数组(指向double的指针)

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

答案 3 :(得分:0)

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