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

您可以将您的替换formemcpy.

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

除此之外,您所做的一切都很好:您正在返回一个指针,因此调用者有机会获得free它。

free另外,我认为如果您要退出,最好不要打电话- 操作系统无论如何都会收集内存。

于 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-ed 的内存并且在你明确释放它之前一直保持 malloc-ed 的东西。

我不想有内存泄漏

当您获得不会释放的内存时,就会发生内存泄漏。实际上,您的代码存在内存泄漏:您没有free复制指针返回的内存:free(ptr);在代码末尾。在这种情况下,这并不重要,但避免忘记它是一个好习惯。

另请注意,如果内存在指向它的指针超出范围时会自动释放,则它将从复制函数本身内部释放,并且您将返回一个无效指针;然后每次指针超出范围时都会有很多双重免费等!幸运的是,这不会发生,因为您使用 malloc 获得的内存必须通过 free 显式释放。

于 2012-05-14T05:26:23.377 回答