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