我是动态内存的新手,我正在尝试学习。 我不断输入代码“以退出代码11完成处理”。 这是一个代码:
int main()
{
int *p;
printf("%d",&p);
p = (int)malloc(sizeof(int));
if(p==NULL)
{
printf("failed");
free(p);
exit(1);
}
printf("%d",p);
*p = 4;
printf("%d",*p);
return 0;
}
答案 0 :(得分:0)
p = (int)malloc(sizeof(int));
这是不对的。 malloc
返回一个指针(void *
),p
是一个指针;完全没有必要强制转换,当然也不必强制转换为int
。如果您很幸运,则强制转换为int
可能没有任何效果。如果您不走运,例如在指针为64位且int
为32位的计算机上,您将得到不正确的指针或某种其他形式的undefined behavior。
其他一些错误:
您应该使用%p
格式说明符来打印指针,而不是%d
。并且您可能希望在打印值之后添加空格或换行符,否则它们将一起运行并且难以阅读。
最好检查malloc
是成功还是失败,但是如果失败,则没有必要在返回的空指针上调用free
。 free(NULL)
被定义为不执行任何操作。
这是程序的正确版本(try on godbolt):
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p;
printf("%p\n",&p);
p = malloc(sizeof(int));
if(p==NULL)
{
printf("failed\n");
exit(1);
}
printf("%p\n",p);
*p = 4;
printf("%d\n",*p);
return 0;
}