【问题标题】:why I keep getting "Process finished with exit code 11"?为什么我不断收到“退出代码 11 完成进程”?
【发布时间】: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 -pedanticgcc,)它可以识别您的问题

标签: c memory dynamic clion


【解决方案1】:
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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2020-07-02
    • 2020-12-05
    • 1970-01-01
    • 2022-07-20
    • 2022-06-30
    • 2018-05-03
    • 2021-04-02
    相关资源
    最近更新 更多