簡體   English   中英

為結構化指針分配 memory

[英]Allocating memory for structured pointer

最近正在處理這個練習:

計算數組中每個元素的大小。 創建一個 function my_count_on_it ,它接收一個字符串數組作為參數,並返回一個包含每個字符串長度的數組。

結構:

typedef struct s_string_array {
    int size;
    char **array;
} string_array;

typedef struct s_integer_array {
    int size;
    int *array;
} integer_array;

所以正確的答案是:

#include <string.h>

integer_array *my_count_on_it(string_array *a) {
    integer_array *ptr;

    ptr = (integer_array *)malloc(sizeof(integer_array));
    ptr->size = a->size;
    ptr->array = (int*)malloc(ptr->size * sizeof(int));

    for (int i = 0; i < a->size; i++) {
        ptr->array[i] = strlen(a->array[I]);
    }

    return ptr;
}

我知道指針存儲一些變量的地址,但我不明白為什么在這種情況下我不能創建一個integer_array的變量類型並用它做所有操作(在循環中),然后才將它的地址存儲在integer_array * ptr 還有一個問題,如果是這樣,為什么我們要創建指針sizeof(integer_array)

例如:

int variable = 5;
int *ptr = &variable;

在這個簡單的例子中,我分別創建變量和指針並存儲地址。 第一個代碼中令人困惑的事情是,在我看來,我們只創建了一個指針,它沒有指向某個地址。

為什么在這種情況下我不能創建integer_array的變量類型並使用它執行所有操作(在循環中),然后才將其地址存儲在integer_array * ptr中?

那將是無效的。 如果你創建一個局部變量,像這樣:

integer_array* my_count_on_it(string_array* a) {
    integer_array local_arr;

    // ...

    return &local_arr;
}

然后您不能返回指向它的指針,因為該變量僅在定義的 function 返回之前有效。 在function的棧上,function的棧在function返回時失效。 因此,返回&local_arr之類的內容是錯誤的,因為它指的是從 function 返回后不應使用的一些 memory(這也是未定義的行為)。 正確的方法是使用malloc() ,它在堆上分配 memory ,可以在程序中的任何其他地方使用並且不會自動釋放(您必須使用free()手動執行)。

如果是這樣,為什么我們要創建指針sizeof(integer_array)

這僅僅是因為您想為上面使用typedef定義的 struct integer_array分配足夠的空間。 這不是指針本身的大小,而是該指針指向的 memory 塊的大小。

第一個代碼中令人困惑的事情是,在我看來,我們只創建了一個指針,它沒有指向某個地址。

最初,當聲明時,指針沒有指向有效的東西。 然后,在你這樣做之后:

ptr = malloc(sizeof(integer_array));

指針現在指向堆中有效的某個地址。 在該地址, malloc()保留了足夠的空間來保存integer_array結構大小的變量。

=== Before malloc(): =========================

ptr = ????? -------> INVALID

=== After malloc(): ==========================

                      Memory
                      |   ...         | ...
ptr = 0x120 ------->  +---------------+ 0x120
                      | space for     | 
                      | integer_array |
                      +---------------+ 0x128
                      |   ...         | ...

還有一件事:強制轉換malloc()的返回值是不必要且錯誤的,請參閱此處以獲取解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM