【发布时间】:2020-09-29 00:27:47
【问题描述】:
我是动态记忆的新手,我正在努力学习。 我不断输入我的代码“进程以退出代码 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;
}
【问题讨论】:
-
你不应该将
malloc的结果转换成非指针类型。 -
您没有安全地打印指针值。您需要使用
%p,并将它们转换为void *。而且您对malloc结果的投射不正确。它应该是int *,而不是int(或者你可以完全省略它)。现在的情况,你的编译器一定抱怨过。为什么你会忽略如此严重的警告?这可能是您的错误的原因。如果 int 小于指针,则将指针转换为 int 然后(隐式)再次返回将不会保留该值。 -
如果您有一个 32 位的
int和一个 64 位的指针,那么通过将其转换为int会丢失其中的 32 位。然后,当您取消引用损坏的指针时:母牛跳过月球。 -
当
malloc返回NULL时,你还在调用free(p);,即free(NULL);为什么?这没有任何意义。 -
信号 11 是 SIGSEGV。
valgrind非常擅长追踪这些。也就是说,您应该始终启用并注意编译器的警告。 (我使用-Wall -Wextra -pedantic和gcc,)它可以识别您的问题