2010-05-03 42 views
0
#include <stdio.h> 
void func(int arr[],int xNumOfElem) 
{ 
    int j; 
    for(j=0; j<xNumOfElem; j++) 
    { 
     arr[j] = j + arr[j]; 
     printf("%d\t",arr[j]); 
    } 
    printf("\n"); 
} 

int main() 
{ 

    int *a,k; 
    a = (int*) malloc(sizeof(int)*10); 


    for(k = 0; k<10; k++) 
    { 
     a[k] = k; 
     printf("%d\t",a[k]); 
    } 
    printf("\n"); 

    func(a,10); //Func call 

    free(a);                                
} 

在函數「func」中將爲動態數組「arr」分配/釋放內存。在這種情況下如何釋放記憶?

arr是函數參數。

回答

0

在函數fun中,不需要爲數組arr分配內存。在調用fun之前,數組的內存分配在main函數中。另外main正在使用內存完成內存釋放;所以fun也不需要做解除分配。

+0

沒有它是按值傳遞,如果ü改變它,它不會反映在主函數的函數裏面的內容。所以不知何故,內存是爲「arr」創建的。 ??? – Riyaz 2010-05-03 06:35:36

+0

數組通過地址傳遞。如果你在函數fun中修改'arr',它會反映在'main'中。試一試。這表明整個數組只有一個副本被分配在'main'中。 – codaddict 2010-05-03 06:38:10

+0

否在這種情況下不反映!!,打印調用函數後實際數組的內容。我證實了它。 – Riyaz 2010-05-03 06:46:54

0

考慮一下這種方式:到

void func(int arr[],int xNumOfElem) 
{ 
    int j; 
    for(j=0; j<xNumOfElem; j++) 
    { 
     arr[j] = j + arr[j]; 
     printf("%d\t",arr[j]); 
    } 
    printf("\n"); 
} 

相當於:

void func(int *arr /* look here */,int xNumOfElem) 
{ 
    int j; 
    for(j=0; j<xNumOfElem; j++) 
    { 
     arr[j] = j + arr[j]; 
     printf("%d\t",arr[j]); 
    } 
    printf("\n"); 
} 
+0

我得到了這個疑問,因爲在一些HDL語言數組可以通過值或通過reffrence傳遞。另外我在這個c文件中犯了一個錯誤,指定了一個[k] = k;調用函數func()後。所以價值在這裏再次發生變化。好的,我會解決這個問題。謝謝!! – Riyaz 2010-05-03 09:25:09

1

你不傳遞一個數組,你只有指針傳遞給一個int。該生產線

void func(int arr[],int xNumOfElem) 

只是寫

void func(int* arr,int xNumOfElem) 

編譯器本身不能爲的副本分配內存的其他方式,爲的大小是動態的,爲此未知的編譯器。在調用func之後打印a的值以查看a已經改變。

要獲得一份改變你的FUNC方法:

void func(int const* const b,int xNumOfElem) 
{ 
    int* arr = malloc(sizeof(int)*xNumOfElem); 
    memcpy(b,arr,xNumOfElem); 
    int j; 
    for(j=0; j<xNumOfElem; j++) 
    { 
     arr[j] = j + arr[j]; 
     printf("%d\t",arr[j]); 
    } 
    printf("\n"); 
    free(arr); 
} 
+0

感謝您的反饋。我得到了我的答案。 – Riyaz 2010-05-03 09:21:53