我现在正在与记忆管理作斗争。这对我很有趣:))
这是我写的简单应用程序。我可以用两种方式分配内存。
int main (int argc, const char * argv[])
{
int *x;
int *z;
x = malloc(sizeof(int));
z = (int *)sizeof(int);
free(x);
free(z);
}
上面代码中使用的内存分配方式有什么不同吗?
答案 0 :(得分:10)
第二行不分配任何内存,它相当于
z=(int *)4;
即,z
将指向地址4
处的(未分配的且非常可能不存在的)(虚拟)内存。如果您执行以下操作:
*z=0;
您的程序将崩溃到访问冲突。
答案 1 :(得分:2)
上面代码中使用的内存分配方式有什么不同吗?
第一个分配内存。第二个没有。
答案 2 :(得分:1)
是。 z = (int *)sizeof(int);
实际上并没有分配内存。我认为这种行为在技术上是未定义的,但是因为你基本上将z
分配给堆的某个未知部分。如果在生产代码中使用,则对free(z)
的相应调用可能会导致重大问题。
当然,您没有对free(z)
的相应电话。你正在释放你。由于我不知道y
是什么,所以我不能告诉你它会做什么。
答案 3 :(得分:0)
您实际上想要将malloc语句强制转换为int指针。所以
x = (int *) malloc(sizeof(int))
答案 4 :(得分:0)
您没有为z
分配内存,如果使用则会导致分段错误
如果您有疑问,是否应该对malloc
的结果进行类型转换,那么您最好不要这样做。有关详细信息,请参阅Do I cast the result of malloc?
另外,对NULL
的返回值进行malloc
检查会比坏的更好!
希望这有帮助!
答案 5 :(得分:0)
应该合并两个陈述。
第一个从堆中分配动态内存并返回指向该区域的void指针。 第二个只是在不分配任何内存的情况下进行转换。
推荐的方法是:
int* a = (int *) malloc( sizeof(int ) );
此外,您可以使用与malloc相同的calloc,但它也会将分配的内存初始化为0。