unsigned int的内存分配(calloc,malloc)

时间:2013-12-23 08:52:12

标签: c malloc calloc

对于我的C应用程序,我尝试初始化内存。我知道较慢的calloc,但幸运的是没有必要跟踪性能。

我只需要一个unsigned int元素的内存空间(最多65535)。

这是我的代码中不起作用的部分:

//Declaration
unsigned int part1;

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

抛出编译器警告:

  

警告:从指针强制转换为不同大小的整数   [-Wpointer到INT铸]

为什么上面的代码不起作用,其中......

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

......效果很好?

谢谢!

3 个答案:

答案 0 :(得分:4)

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)”。如果您依赖此代码,您的代码将无法移植。更重要的是,如果使用指针存储单个整数,则会泄漏新分配的内存,并且无法存储多个数组元素。

答案 1 :(得分:0)

使用以下代码。 Calloc()将返回void *所以你必须在SomeType *

中转换它
  

unsigned int * part1;

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

答案 2 :(得分:0)

您必须了解这些类型的内存分配以避免出现这些错误:

静态内存分配:

unsigned int part1;

尺寸固定。它需要在编译时知道。释放内存直接在作用域出口处完成。变量在堆栈上分配。 实际上,这种类型的内存分配是在编译时完成的,它的生命周期是整个程序运行时。 使用这种类型的分配的优点是有效的执行时间。 但是如果我们声明的静态数据空间比我们需要的多,我们就会浪费空间,这就是这种类型的缺点。

动态内存分配:

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

大小可以变化,您可以在运行时找到该值。您负责使用free()预定义的C函数释放内存。变量在堆上分配。

您可以在网站上看到更多详细信息:http://www.cs.virginia.edu/~son/cs414.f05/lec11.slides.pdf