【关于C语言二进制拷贝文件的几个问题】

【关于C语言二进制拷贝文件的几个小问题】
C/C++ code
#include<stdio.h>
#include <malloc.h>
int main(void)
{
    int nLen;
    FILE *fp,*fp1;
    fp=fopen("123.exe","rb");
    
    fseek(fp,0L,SEEK_END);
    nLen = ftell(fp);
    char *buffer = (char*)malloc(sizeof(char)*nLen+1);
    //这里用int数组也可以哦 注意用int时把下面三处的nLen+1的+1去掉
    //int *buffer = (int*)malloc(sizeof(int)*nLen);
    //void 指针 不知道是个什么意思 竟然也可以
    //void *buffer = (void*)malloc(nLen);
    
    if (buffer==NULL)
    {
        printf("memory error!\n");
    }
    fseek(fp,0,SEEK_SET);
    fread(buffer,nLen+1,1,fp);
    fclose(fp);

    fp1=fopen("456.exe","wb");
    fwrite(buffer,1,nLen+1,fp1);
    
    fclose(fp1);
    free(buffer);
}


1 为什么 必须要用wb rb 如果不加b 那么默认我记得写变量到文件里 打开看也是乱码的 用UE打开可以看到 应该是二进制的写入的啊

2 char *buffer = (char*)malloc(sizeof(char)*nLen+1);
//这里用int数组也可以哦 注意用int时把下面三处的nLen+1的+1去掉
int *buffer = (int*)malloc(sizeof(int)*nLen);
//void 指针 不知道是个什么意思 竟然也可以
void *buffer = (void*)malloc(nLen);


这三种方法都可以二进制复制文件 都有什么区别 哪个是正确的?


谢谢各位 探讨一下

------解决方案--------------------
1 windows平台,要指定b,二进制方式读
2 本质都是分配一块空间,都可以
------解决方案--------------------
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了