对于我的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));
......效果很好?
谢谢!
答案 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