C呼び出しreadの文字化けし問題


自分が本当にいろいろな高級言語に甘やかされていることに気づいた.Cを游ぶのは本当にいろいろ分からない.
に質問
例えば、次のコードは正しく出力できますが、
ret = readfile (fd, buf, len);

に代わる
readfile (fd, buf, len);

出力が文字化けした.
わかりませんね.(:з」∠)
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

// ssize_t readfile(int fd, void* vBuf, size_t len){
ssize_t readfile(int fd, char* vBuf, size_t len){
    char* pBuf = vBuf; 
    ssize_t ret, total;

    while (len != 0 && (ret = read (fd, pBuf, len))!=0){
         if (ret == -1){
            if (errno == EINTR)
                continue;
            perror("read");
            break;
        }
        len -= ret;
        pBuf += ret;
        total += ret;
    }
    return total;
}

int main(){
    int fd;
    //    
    fd = open ("test.txt", O_RDONLY);
    if (-1 == fd){
        perror("open file failed");
        return -1;
    }
    char buf[512];
    size_t len = 200;
    ssize_t ret;

    ret = readfile (fd, buf, len);
    printf("%s
", buf); return 0; }

補足
  • void*をchar*コンパイラに変更するとwarningは報告されませんが、結果
  • には影響しません.
  • 以上の問題はubuntuで発見され、openSUSEを交換しても問題ない(gcc(SUSE Linux)4.6.2)、win 7 x 64下char buf[512];char bufに変更[200];大丈夫です.
  • ubuntuでchar buf[512];char bufに変更します.正しい結果が得られるが、windows下のgcc(tdm 64-1)4.7に同じコード(char buf)が投げ込まれる.1異常を報告します.OpenSUSEに投げつけperror行出力Bad Addressエラー
  • gdbのデバッグを習います