C语言 为什么我得到编译错误?虽然程序运行[关闭]

z4iuyo4d  于 2023-04-11  发布在  其他
关注(0)|答案(2)|浏览(110)

已关闭,该问题需要details or clarity,目前不接受回答。
**想要改进此问题?**通过editing this post添加详细信息并澄清问题。

昨天关门了。
Improve this question
尝试编写一个程序,根据从用户那里收到的数量动态分配内存,并在不释放内存的情况下结束运行。

#include <stdio.h>
#include <stdlib.h>
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

int main(void)
{
    int num = (int)malloc(sizeof(int)); 
    free(num); 
    scanf("%d",&num); 
    printf("Leaks: %d", _CrtDumpMemoryLeaks()); 
    getchar();
    return 0;
}

它的运行,并给出0泄漏,但测试系统给我一个编译错误

q3qa4bjr

q3qa4bjr1#

函数free的参数类型为void *

void free(void *ptr);

但你称之为传递一个整数

free(num);

没有从int类型到void *类型的隐式转换。因此编译器发出错误。
还要注意的是,一般来说,int类型的对象不足以存储地址,所以调用free也会调用未定义的行为。

qaxu7uf2

qaxu7uf22#

更正:

int *num = malloc(1*sizeof(int));
scanf("%d",num);
free(num);

阅读Vlad关于为什么它是错误的解释。他解释得很正确。其次,如果你的代码不需要C++兼容性,千万不要转换你的malloc指针。这是不好的做法。
integar类型int在声明时已经分配了内存,因为int的大小是编译器已知的。你不应该为integer类型分配内存。malloc返回一个指向分配内存的指针,所以你不能在非指针类型中存储malloc返回值。
下一个你做错的事情是你试图在释放内存后使用scanf读取一个值。如果你没有内存,它会存储在哪里?

相关问题