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

v1v2は、操作するメモリブロックへのポインタです。しかし、あなたは彼らのアドレスをあなたのcpyarray関数に渡しています。

v2したがって、間違ったメモリブロックを操作し、変数の周りのメモリを踏んで、何v2を指すかを変更しています。

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

に渡さ&v2cpyarray()ます。これは、関数がポイントしている場所を変更していることを意味しますv2。無効な場所を指しているため、を逆参照するとセグメンテーション違反が発生しますprintf()

代わりに、に渡しv2cpyarray()ください。

于 2012-08-26T17:44:46.067 に答える
0

関数に間違ったポインタを渡していますcpyarray

コードはポインタを配列に送信します(ポインタからポインタをdoubleに送信します)

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

代わりに配列を送信する必要があります(doubleへのポインタ)

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

現在の回答が指摘している問題に加えてcpyarray、配列をコピーせず、その一部のみをコピーします。で型を模倣しようとする代わりにi*memsize、メモリブロックをバイトの束として扱い、それらを1つずつコピーします。今、あなたがしなければならないのは、コピーするバイト数を把握することだけですが、それは難しいことではありません。

于 2012-08-26T17:49:05.590 に答える