[英]What does allocating memory of size char * do?
char *str;
str = malloc(sizeof(char) * 5);
此代碼將5個連續的內存槽分配給變量str
,其類型為char *
。
char *str;
str = malloc(sizeof(char *) * 5);
這應該分配char數組的5倍內存。 但是因為在我們聲明它之前,char數組沒有大小,所以這個語句實際上做了什么?
第一部分
此代碼為變量
str
分配5個“連續內存槽”,其類型為char *
。
不,不是真的。 確切地說,如果它成功,它返回一個指向內存塊的指針,該內存塊足夠容納5個char
,這是提供給malloc()
的大小。 在C
, sizeof(char)
保證為1
,因此為5個字節。
相關的, C11
,章節§7.22.3.4
malloc()
函數為一個對象分配空間,該對象的大小由size
指定,其值是不確定的。
因此,沒有“連續塊”,它是具有指定大小的內存區域( “an”對象的空間 )。
在后面的例子中,大小是char *
,一個指針。 根據您的環境,字節數將是5 * sizeof (char *)
,其中sizeof(char *)
可以是4或8或其他任何內容。
注意 ,兩種情況下,返回的指針都是void *
類型。
還要注意這個
在malloc()
參數中提供大小時使用的數據類型對返回的指針沒有附加或影響,它僅用於計算要傳遞給malloc()
的size
。
例如,如果碰巧對於某個平台, sizeof(int)
=== sizeof(float)
,那么,我們可以寫
int *intPtr = malloc(sizeof *fltPtr); //int pointer
float *fltPtr = malloc(sizeof *intPtr); // float pointer
考慮到成功,我們可以完美地利用這兩個指針。
以下代碼
char **str = malloc(sizeof(char *) * 5);
為char *
類型的5個連續元素分配內存,即: 指向char的指針 。
然后,您可以分配char
類型的N個連續元素,並將它們的地址分配給這些指針:
for (int i = 0; i < 5; i++)
str[i] = malloc(sizeof(char) * N));
char *str;
str = malloc(sizeof(char *) * 5);
它分配足夠的內存來存儲5個指向char(5個地址)的指針。 它不是為存儲數組分配內存,而是僅分配它們的地址
第二部分實際上分配了5次char的指針,而不是數組。
// main.c
#include <stdio.h>
int main()
{
printf("%u\n", sizeof(char *));
}
如果在32位環境中編譯上述代碼,則此代碼將打印4.在64位環境中,此代碼將打印8.(您可以在64位環境中自行測試,方法如下所述: 如何測試 。)
所以基於你的環境, char *str = malloc(sizeof(char *) * 5);
分配由str
指向的20
或40
字節的內存。 因此,如果您計划在str
存儲c-type-string,則可以存儲19
或39
字符。
我在64位 Ubuntu 14.04上。 在64位環境中,您可以使用以下編譯器選項測試上面的示例代碼。
$ gcc -m32 -o out32 main.c
$ ./out32
4
$ gcc -o out64 main.c
$ ./out64
8
如果你收到錯誤說sys/cdefs.h: No such file or directory
那么安裝以下包。
$ sudo apt install libx32gcc-4.8-dev
$ sudo apt install libc6-dev-i386
(獲得本文中的包裝名稱)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.