将数组复制到动态分配的内存

Pai*_*guy 4 c memory arrays pointers dynamic

我的代码工作正常,但我觉得有一种更快的方法可以做到这一点,特别是在我的函数副本中.这是我的代码.这会更快吗?这是在顺便说一句.此外,当我从函数返回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;
}
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 5

你可以for用一个替换你memcpy.

memcpy(cpy, a, ele * sizeof *cpy);
Run Code Online (Sandbox Code Playgroud)

除此之外,你正在做的事情还不错:你正在返回一个指针,因此调用者有机会这样做free.

另外我认为好的做法是不要打电话,free如果你要退出 - 操作系统无论如何都会收集内存.

  • 似乎我们发布了相同的解决方案.:-)我很好奇为什么你说这是一个很好的做法,不要在退出之前通过Cnicutar免费通话.虽然在我的业务中这样的琐碎程序显然无关紧要,但良好的清理程序非常重要.如果你不清理它更难以跟踪Valgrind中的错误.这个最佳实践背后的理由是什么?也许我应该就此发表一个问题...... (2认同)

Dav*_*ond 5

使用 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;
}
Run Code Online (Sandbox Code Playgroud)