[英]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.