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