2017-02-26 98 views
-3
#include <stdio.h> 

int* createReverseArray(int *array, int size) 
{ 
    int i; 
    int newArray[size]; 
    for(i=size-1; i>=0; i--) 
    { 
     newArray[i] = array[size-i-1]; 
    } 

    return newArray; 
} 

int main(void) { 

    int myArray[] = {1,2,3,5,1}; 
    int myArray2[] = {1,2,3,4,2,1}; 
    int i; 

    int size = sizeof(myArray)/sizeof(int); 
    printf("Size: %d\n", size); 
    int* newArray = createReverseArray(myArray, size); 

    for(i=0; i<size; i++) 
    { 
     printf("%d, ", newArray[i]); 
    } 

    return 0; 
} 

我打印createReverseArray函數中的數組,並得到了正確的輸出,但是當我指針返回數組,然後嘗試打印結果,我認爲它是指向每個陣列點的指針?我不太確定。返回指針數組沒有給出預期輸出在C

這將返回:

大小:5

12341002,1,-10772231820,-1077231812,1074400845,

+2

這是我敢肯定,一個經典的錯誤已被問在計算器上之前。您正在返回一個指向內部函數分配的內存的指針,該函數將消失。 Go語言足夠聰明,可以完成這項工作並將該內存移動到堆上,但C無法做到這一點。你必須自己爲這個數組設置malloc空間。 –

+1

@RayToal:它已被問過1000次以上...是的,這是一個非常基本的錯誤,不是從語言的基本概念開始。就像一本好C書一樣。 – Olaf

回答

2

newarray是一個自動局部變量。一旦函數返回,它將不再存在。返回指向一個自動局部變量的指針調用undefined behaviour,在這種情況下可以預料到沒有什麼好處。

可以diynamically分配內存,然後返回指向它的指針

int *newArray = malloc(sizeof(int)*size); 
+0

即使我在createReverseArray()中調用malloc,我可以釋放主函數中的內存嗎? – DJSweetness

+0

@DJSweetness;是。閱讀「免費」功能的工作原理。 – haccks

相關問題