0

以下程序在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

4 回答 4

2

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

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

cpyarray(v2, v1, sizeof(double), N);
于 2012-08-26T17:45:06.677 回答
0

You are passing &v2 to cpyarray(), which means that your function is changing where v2 is pointing! Since it's now pointing to an invalid location, you get a seg fault when you dereference it for printf().

Instead, just pass v2 to cpyarray().

于 2012-08-26T17:44:46.067 回答
0

您正在传递错误的cpyarray函数指针。

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

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

您应该改为发送数组(指向双精度的指针)

cpyarray(v2, v1, sizeof(double), N);
于 2012-08-26T17:45:40.507 回答
0

除了当前答案指出的问题之外,cpyarray不复制数组,只是复制其中的一部分。不要试图用 来模仿类型i*memsize,只需将内存块视为一堆字节并一个一个地复制它们。现在您所要做的就是弄清楚要复制多少字节,这并不难。

于 2012-08-26T17:49:05.590 回答