将malloc的结果转换为char(不是char*) - 为什么编译器没有抱怨?

Naf*_*aly 5 c casting

tmpString = (char*)malloc((strlen(name) + 1) * sizeof(char));
tmpString = (char )malloc((strlen(name) + 1) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)

这两行之间有什么区别?

我的理解是第二行是错误的,但由于某种原因,编译器什么也没说.

Tim*_*sch 5

第一行转换(void)指针,malloc返回指向char的指针,从而保留其指针.所有它告诉编译器"位置X的内存应该被视为字符数组".

第二个转换将malloc返回的指针转换为单个字符.由于多种原因,这很糟糕:

  • 当你把指针变成完全不同的东西时,你会丢失指针
  • 你也失去了指针的大部分数值,因为字符的大小远小于指针的大小(在很多情况下,指针大小为32位或64位,但字符只有8位)位)并且"多余"位被丢弃.

我认为警告级别设置得足够高的编译器应警告第二次分配.