2014-09-11 134 views
0

在我嘗試學習一些關於指針的知識時,我嘗試創建一個程序,爲給定大小的數組分配內存(其大小由常量ARR_SIZE的值定義),並將該數組的元素打印到安慰。爲什麼我的程序打印出奇怪的數組值?

我無法理解我得到的結果...例如,當我運行下面顯示的代碼時,我得到了{0, 4206628, 4206628, 3, 4, 5, 6, 2686696, 8, 9},這對我來說絕對沒有意義。我想知道這種行爲的原因是什麼以及爲了獲得預期結果需要修改什麼。

#define ARR_SIZE 10 

void print_array(int loc); 
int memory_alloc(); 

int main() 
{ 
    int array_loc = memory_alloc(); 

    print_array(array_loc); 

    return 0; 
} 

void print_array(int loc) 
{ 
    int i = 0; 
    int *arr_ptr; 

    arr_ptr = loc; 

    while(i < ARR_SIZE) 
    { 
     printf("%d\n", *arr_ptr); 
     *(arr_ptr++); 
     i++; 
    } 
} 

int memory_alloc() 
{ 
    int array[ARR_SIZE]; 
    int i = 0; 

    for(i; i < ARR_SIZE; i++) 
    { 
     array[i] = i; 
    } 

    return &array; 
} 
+0

你看過你的編譯器輸出嗎?如果它是一半的,它應該告訴你什麼是錯的。 – 2014-09-11 10:28:36

回答

1
int array[ARR_SIZE]; 

這裏整數數組是本地的功能,它不會再使用功能結束後。

爲了使它工作,你可以像

static int array[ARR_SIZE]; 

而且

return array; //no need & 
+0

謝謝。我將你的答案標記爲已接受的答案,因爲你是最快的答案。 – Kapol 2014-09-11 10:42:09

1

你是在memory_alloc聲明Array()函數

int array[ARR_SIZE]; 

這個數組是本地變量。它的範圍在函數memory_alloc()中,只要這個函數返回,所有的局部變量都被銷燬(所以你的數組[]也是這樣的)[0122] memory_alloc()。

2

您正在觀察的是未定義的行爲,因爲在memory_alloc中創建的數組只存在於此函數的作用域中。一旦程序離開它,該陣列將不再存在。

另一種方法是在數組中的堆分配:

int memory_alloc() 
{ 
    int *array = malloc(ARR_SIZE * sizeof(int)); 
    int i = 0; 

    for(i; i < ARR_SIZE; i++) 
    { 
     array[i] = i; 
    } 

    return array; 
} 

您正在使用的陣列完成後,它應該被釋放。

int main() 
{ 
    int* array_pointer = memory_alloc(); 

    // use array here 

    free(array_pointer); 
    return 0; 
} 
相關問題