我的代码工作正常,但我觉得有一种更快的方法可以做到这一点,尤其是在我的函数副本中。这是我的代码。这会更快吗?这是在顺便说一句。此外,当我从函数返回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;
}
答案 0 :(得分:5)
您可以将for
替换为memcpy
。
memcpy(cpy, a, ele * sizeof *cpy);
除此之外,你正在做的事情还不错:你正在返回一个指针,因此调用者有机会free
它。
此外,我认为如果您要退出,不要拨打free
这是一个好习惯 - 操作系统无论如何都会收集内存。
答案 1 :(得分: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;
}
答案 2 :(得分:2)
是否会删除动态内存,因为它超出了范围
不,它没有:超出范围的唯一内存是持有指针的内存;你返回那个指针的值,它是你访问malloc-ed的内存所需要的唯一东西,并且在你明确释放之前保留malloc-ed。
我不想让内存泄漏
当您获得不会释放的内存时,就会发生内存泄漏。实际上,您的代码存在内存泄漏:您没有free
代码末尾的副本free(ptr);
返回指针的内存。在这种情况下,它并不重要,但避免忘记它是一个好习惯。
另请注意,如果内存在指向它的指针超出范围时将自动释放,则它将从复制函数本身内部释放,并且您将返回无效指针;每次指针超出范围时,会有很多双重自由和相似的东西!幸运的是,这不会发生,因为使用malloc的内存必须使用free进行显式释放。