簡體   English   中英

分配大小為char *的內存有什么作用?

[英]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()的大小。 Csizeof(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指向的2040字節的內存。 因此,如果您計划在str存儲c-type-string,則可以存儲1939字符。


怎么測試

我在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.

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