Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将阵列复制到动态分配的内存_C_Arrays_Memory_Pointers_Dynamic - Fatal编程技术网

C 将阵列复制到动态分配的内存

C 将阵列复制到动态分配的内存,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

我让我的代码正常工作,但我觉得似乎有一种更快的方法可以做到这一点,尤其是在我的函数副本中。这是我的密码。这能再快一点吗?顺便说一句,当我从函数返回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;
}
#包括
#包括
双*副本(双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;
}