在C中分配内存的方法

时间:2011-10-05 14:10:39

标签: c

我现在正在与记忆管理作斗争。这对我很有趣:))

这是我写的简单应用程序。我可以用两种方式分配内存。

int main (int argc,  const char * argv[])
{
    int *x;
    int *z;

    x = malloc(sizeof(int));
    z = (int *)sizeof(int);

    free(x);
    free(z);
}

上面代码中使用的内存分配方式有什么不同吗?

6 个答案:

答案 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。