5

コードは機能しましたが、特に関数のコピーでこれを行うためのより高速な方法があるように感じます。これが私のコードです。これはもっと速くできますか?これはC言語です。また、関数からcpyを返すと、スコープ外であるため動的メモリが削除されますか?メモリリークが発生したくない:P

#include <stdio.h>
#include <stdlib.h>
double *copy(double a[], unsigned ele);
int main(){
    double arr[8], *ptr;
    unsigned i=0;
    for(;i<7;i++){
        scanf_s("%lf", &arr[i]);
    }
    ptr=copy(arr, 8);
    for(i=0;i<7; i++)
        printf("%f", ptr[i]);

}

double *copy(double a[], unsigned ele){
    double *cpy= malloc(sizeof(double)*ele);
    int i=0;
    for(;i<ele; i++)
        cpy[i]=a[i];
    return cpy;
}
4

3 に答える 3

6

forに置き換えることができますmemcpy

memcpy(cpy, a, ele * sizeof *cpy);

それ以外は、あなたがやっていることはかなり大丈夫です。あなたはポインタを返しているので、発信者はfreeそれにチャンスがあります。

また、終了する場合は呼び出さfreeないことをお勧めします。OSはとにかくメモリを収集します。

于 2012-05-14T05:15:17.367 に答える
4

Memcpyを使用します。基盤となるハードウェアなどを利用できる可能性があります...車輪の再発明をする必要はありません。:-)

void * memcpy ( void * destination, const void * source, size_t num );


double *copy(double a[], unsigned ele){
    size_t size = sizeof(double)*ele ;
    double *cpy= malloc(size);
    memcpy( cpy, a, size ) ;
    return cpy;
}
于 2012-05-14T05:17:26.013 に答える
2

スコープ外なので動的メモリを削除しますか

いいえ、そうではありません。スコープ外になるメモリは、ポインタを保持しているメモリだけです。そのポインタの値を返します。これは、mallocしたメモリにアクセスするために必要な唯一のものであり、明示的に解放するまでmallocされたままになります。

メモリリークが発生したくない

解放しないメモリを取得すると、メモリリークが発生します。実際、コードにはメモリリークがあります。コードの最後にfree、ポインタがコピーによって返されるメモリはありません。free(ptr);この場合、それほど重要ではありませんが、忘れないようにすることをお勧めします。

また、メモリへのポインタがスコープ外になったときにメモリが自動的に解放されると、コピー関数自体の内部から解放され、無効なポインタが返されることにも注意してください。そして、ポインタがスコープから外れるたびに、ダブルフリーなどがたくさんあります!幸い、mallocを使用して取得したメモリは、freeで明示的に解放する必要があるため、これは発生しません。

于 2012-05-14T05:26:23.377 に答える