簡體   English   中英

無符號int的內存分配(calloc,malloc)

[英]Memory allocation (calloc, malloc) for unsigned int

對於我的C應用程序,我嘗試初始化內存。 我知道較慢的calloc,但幸運的是,無需跟蹤性能。

我只需要一個無符號int元素的內存空間(最多65535)。

這是我的代碼無效的部分:

//Declaration
unsigned int part1;

//Allocation
part1 = (unsigned int) calloc (1,sizeof(unsigned int));

這引發了編譯器警告:

警告:從指針轉換為不同大小的整數[-Wpointer-to-int-cast]

為什么上面的代碼不起作用,在哪里...

unsigned long size;
size =(unsigned long) calloc (1,sizeof(unsigned long));

...效果很好?

謝謝!

calloc返回void*因此您應該像這樣使用它

unsigned int* part1 = calloc (1,sizeof(*part1));

然后像分配它

*part1 = 42;

如果您已為幾個元素分配空間

part1[0] = 42; // valid indices are [0..nmemb-1]

可能更清楚。

請注意,您稍后還必須free此內存

free(part1);

另外,如果只需要一個元素,只需在堆棧上聲明它即可

unsigned int part1 = 42;

關於為什么將點強制轉換為unsigned long不會生成警告,請在您的平台上使用sizeof(void*)==sizeof(unsigned long) 如果您依賴此代碼,則該代碼將不可移植。 更重要的是,如果使用指針存儲單個整數,則會泄漏新分配的內存,並且無法存儲一個數組中的多個元素。

使用下面的代碼。 Calloc()將返回void *,因此您必須將其轉換為SomeType *

unsigned int * part1;

//Allocation
part1 = (unsigned int*) calloc (1,sizeof(unsigned int));

您必須了解以下類型的內存分配,以避免發生以下錯誤:

靜態內存分配:

unsigned int part1;

大小是固定的。 需要在編譯時知道它。 釋放內存直接在范圍出口處完成。 該變量分配在堆棧上。 實際上,這種類型的內存分配是在編譯時完成的,其生存期是程序的整個運行時。 使用這種類型的分配的優點是有效的執行時間。 但是,如果聲明的靜態數據空間多於所需的空間,那么這將是這種類型的缺點。

動態內存分配:

unsigned int * part1 = calloc(n,sizeof(unsigned int));

大小可能有所不同,您可以在運行時找到該值。 您負責使用free()預定義的C函數釋放內存。 該變量分配在堆上。

您可以在網站上查看更多詳細信息: http : //www.cs.virginia.edu/~son/cs414.f05/lec11.slides.pdf

暫無
暫無

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

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