为什么我一直显示“退出代码为11的处理完成”?

时间:2020-06-09 18:08:23

标签: c memory dynamic clion

我是动态内存的新手,我正在尝试学习。 我不断输入代码“以退出代码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;
}

1 个答案:

答案 0 :(得分:0)

p  = (int)malloc(sizeof(int));

这是不对的。 malloc返回一个指针(void *),p是一个指针;完全没有必要强制转换,当然也不必强制转换为int。如果您很幸运,则强制转换为int可能没有任何效果。如果您不走运,例如在指针为64位且int为32位的计算机上,您将得到不正确的指针或某种其他形式的undefined behavior

其他一些错误:

  • 您应该使用%p格式说明符来打印指针,而不是%d。并且您可能希望在打印值之后添加空格或换行符,否则它们将一起运行并且难以阅读。

  • 最好检查malloc是成功还是失败,但是如果失败,则没有必要在返回的空指针上调用freefree(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;
}