C 将阵列复制到动态分配的内存
我让我的代码正常工作,但我觉得似乎有一种更快的方法可以做到这一点,尤其是在我的函数副本中。这是我的密码。这能再快一点吗?顺便说一句,当我从函数返回cpy时,它是否删除了动态内存,因为它超出了范围?我不想有内存泄漏:PC 将阵列复制到动态分配的内存,c,arrays,memory,pointers,dynamic,C,Arrays,Memory,Pointers,Dynamic,我让我的代码正常工作,但我觉得似乎有一种更快的方法可以做到这一点,尤其是在我的函数副本中。这是我的密码。这能再快一点吗?顺便说一句,当我从函数返回cpy时,它是否删除了动态内存,因为它超出了范围?我不想有内存泄漏:P #include <stdio.h> #include <stdlib.h> double *copy(double a[], unsigned ele); int main(){ double arr[8], *ptr; unsigned
#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;
}
#包括
#包括
双*副本(双a[],无符号ele);
int main(){
双arr[8],*ptr;
无符号i=0;
对于(;i您可以用memcpy
替换for
memcpy(cpy, a, ele * sizeof *cpy);
除此之外,您正在做的事情非常好:您正在返回一个指针,因此调用方有机会释放它
我也认为不调用<代码>免费>代码是一个好的实践。如果你要退出,OS无论如何都会收集内存。
使用MeMCPY。它可以利用你的底层硬件等。不需要重新发明轮子。
它是否删除了动态内存,因为它超出了范围
不,它不是:唯一超出作用域的内存是保存指针的内存;您返回该指针的值,并且它是您需要访问已malloc并保持malloc的内存的唯一内容,直到您显式释放它
我不想内存泄漏
内存泄漏发生在您获得不释放的内存时。事实上,您的代码存在内存泄漏:您没有释放内存,指针通过复制返回:释放(ptr);
在代码末尾。在这种情况下,不太重要,但最好避免忘记它
还要注意的是,如果当指向它的指针超出作用域时,内存将自动释放,那么它将从复制函数本身中释放,并且您将返回一个无效指针;然后每次指针超出作用域时,都会有大量的双重释放和类似的释放!幸运的是,这不会发生,因为您得到了usi内存ng malloc必须使用free显式释放。哦,知道这一点很好,谢谢:)。不过,我的教授希望我们手动执行,以查看发生了什么。哦,好吧,在这种情况下,我不需要调用free。@NimaGanjehloo嗯,操作系统并不真正关心malloc
。它无论如何都会收回内存。看来我们发布了相同的解决方案on.:-)我很好奇你为什么说在退出Cnicutar之前不打免费电话是一种好的做法。显然,在我的业务中,这样的琐碎程序并不重要,一个好的清理程序很重要。如果你不清理,在Valgrind追踪bug会困难得多。你认为这种最佳做法背后的原因是什么?Perhaps我应该就此发表一个问题…@DavidMokonBond不久前我从R..
上读到一篇关于这个问题的帖子。这篇帖子详细说明了无用的免费软件实际上是如何让事情慢下来的。但是,是的,一个“正确的”MalOC/FILE是为了内存泄漏检查程序而需要的。它不仅仅是琐碎的程序:如果你要退出<代码>免费< /代码>对任何人都没有好处。我认为好的做法正好相反:总是调用显式的免费!(只是写了它,否则就不值得一提)。这是一个很好的“记忆练习”。,您不会习惯于“因为程序即将退出”…如果它减慢了退出速度,我想知道是否有优化器能够在识别出程序可以从中退出的唯一流/路径时删除free…然而,值得一提的是,并非所有操作系统都能够自动释放程序分配的内存!!因此,毕竟,总是释放内存是一种很好的做法y、 int size=sizeof(double)*ele
您可能希望将其更改为size\u t
。
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;
}