2014-12-29 48 views
0

這只是程序的一部分,但我不明白這些代碼爲什麼我們在結構中聲明int *數組是什麼意思? 另外我們通常在函數類型之前使用int或void爲什麼我們在創建函數之前編寫struct Stack *還有在這裏使用unsigned是什麼?點擊鏈接查看實際的程序。 a link使用數組的C堆棧

struct Stack { 
    int top; 
    unsigned capacity; 
    int* array; 
}; 

struct Stack* createStack(unsigned capacity) { 
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack)); 
    stack->capacity = capacity; 
    stack->top = -1; 
    stack->array = (int*) malloc(stack->capacity * sizeof(int)); 
    return stack; 
} 

int main() { 
    struct Stack* stack = createStack(100); 
} 
+7

不要被冒犯,但你需要有'c'數據類型的基礎課程。有很多基本的概念問題。 –

+3

'int *'不是一個數組,它是一個指針。 –

+0

Unsigned表示無符號整數。 – andyn

回答

1

1)INT *的使用,因爲我們沒有手的數組如何巨大的將是以前知道,所以我們聲明爲指針,使用堆棧的能力做的malloc。

如果我們使用了一個數組,我們不得不執行額外的檢查來查看我們的初始聲明大小是否被溢出,並且會在整個程序中造成巨大的開銷。

2)函數create stack根據函數的語法返回類型stack的結構體ponter。

Syntas:

<return type> function_name(<Parameters>){<Statements>} 

3)我們希望該計劃,如果有人試圖聲明負容量給我們一個錯誤。無符號確保這是滿意

希望這會有所幫助。

+0

所以,基本上創建堆棧用於創建一個足夠大的結構來容納100個數組元素。 在鏈表中,我們創建了獨立節點,即單獨的結構,但是具有相同類型的多個結構, 1個元素,但是這裏我們只爲每個100個元素創建一個相同類型的結構或獨立結構? – Stack

+0

1結構。分配了100個int元素。但是在yoru鏈接中只有3個被使用。 –

+0

你是什麼意思,只有3我們已經創建了100個元素的堆棧[創建堆棧(100)] – Stack

1

爲什麼我們在結構中聲明int *數組是什麼意思?

array成員用於存儲堆棧的內容。但是,我們事先並不知道堆棧需要保存多少個元素,所以我們不能將其聲明爲常規數組(其大小必須在編譯時間處已知)。相反,我們將在運行時使用庫函數分配內存,該函數返回一個指向動態分配塊的第一個元素的指針;這個指針將被存儲到數組成員。

爲什麼我們寫結構堆疊*之前創建功能

因爲createStack函數返回一個指向新struct Stack實例:

struct Stack *createStack(...) ----------------+ 
{             | The type of the expression in the 
    struct Stack *stack = ...; -----+    | `return` statement must match the 
    ...        |    | return type of the function 
    return stack; <-----------------+---------------+ 
} 

什麼用的無符號在這裏

unsignedunsigned int的簡稱;它保證只有非負值可用於堆棧大小。

這裏是內存看起來像createStack函數被調用後:

    +---+ 
      stack: | |----+ // The stack variable points to a struct Stack instance 
        +---+ | 
        ...  | 
        +---+ | 
     stack->top: | |<---+ // The actual struct Stack instance is created on the heap 
        +---+  // The -> operator allows us to refer to the members of the 
    stack->capacity: | |  // instance through the stack pointer variable. 
        +---+  
    stack->array: | |----+ // The memory for the stack contents is allocated in a 
        +---+ | // separate malloc call, and the resulting pointer is 
        ...  | // stored in the instance's array member. 
        +---+ | 
    stack->array[0]: | |<---+ 
        +---+ 
    stack->array[1]: | | 
        +---+ 
    stack->array[2]: | | 
        +---+ 
        ... 
        +---+ 
stack->array[N-1]: | | // N == stack->capacity 
        +---+ 

main點的struct Stack一個實例的stack變量;這個實例是由該行創建的

struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack)); 

createStack函數中。堆棧實例的內存取自「堆」(爲動態分配保留的內存區域)。內的棧實例中,array構件也指向由另一個呼叫保留動態存儲器的區域以malloc

stack->array = (int*) malloc(stack->capacity * sizeof(int)); 

這個函數設置留出足夠的存儲器中作爲在capacity構件指定用來存儲許多int對象。

編輯

注意兩個malloc呼叫可以被清理如下:

struct Stack *stack = malloc(sizeof *stack); 
... 
stack->array = malloc(stack->capacity * sizeof *stack->array); 

除非您使用的是C++編譯器或C編譯器,早在1989年的標準,投是不必要的(並且在C89實現上,很危險)。

sizeof表達式使用解除引用的目標表達式,而不是類型名稱;這將清理一些視覺混亂,並且如果您決定更改目標變量的類型(例如,從int *double *),它會減少維護。表達式*stack的類型是struct Stack,所以它遵循sizeof *stack == sizeof (struct Stack)。類似地,表達*stack->array的類型是int,因此sizeof *stack->array == sizeof (int)。請注意,只有在sizeof的操作數是類型名稱時才需要括號。


1. C99引入可變長度數組,其大小可以在運行時被指定,但在這方面有以下幾個原因它們將不起作用。

+0

詳細說明請參考.. 堆棧變量主要指向結構堆棧的一個實例,它類似於說棧變量是結構體的一個對象有堆棧的所有成員的副本的堆棧? 通過使用結構而不是使用數組的簡單堆棧來實現這個附加優點? 也在最後一行u說,如果它從int更改爲double,所以最好用第二種方式編寫,但是通過僅將(int)更改爲(double)不會在第一種方法中更簡單? – Stack