需要帮助来理解此代码的输出

时间:2011-10-31 18:54:00

标签: c

看我的代码是

#include <stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
int main(int argc, char**argv) {

    unsigned char *message = NULL;

    struct stat stp = { 0 };
    stat("huffman.txt", &stp);
    /*determine the size of data which is in file*/
    int filesize = stp.st_size;
    printf("\nFile size id %d\n", filesize);

    FILE* original_fileptr = fopen("huffman.txt", "r");
    message =  malloc(filesize);
    fread(message, 1, filesize, original_fileptr);
    printf("\n\tEntered Message for Encode is %s= and length %d", message,strlen(message));

    return 0;
}

这里huffman.txt的大小为20个字节,后面的字符是

άSUä5Ñ®qøá“F“œ

此代码的输出

File size id 20

        Entered Message for Encode is ά­SUä5Ñ®qøá"F„œ= and length 21

现在的问题是,如果大小是20,那么为什么长度是21?

1 个答案:

答案 0 :(得分:6)

因为C没有本地字符串,只有字符数组,并且存在一个隐藏的,无处不在的假设,即最后一个数组成员为零。

由于你通过只读取20个字节到20个元素的数组来违反这个假设,不考虑最后的字节是否为零,然后使用 string 等功能,如%sstrlen,你基本上得到了未定义的行为。

得到21的回答是纯粹的运气;任何事情(更糟糕的事情)都可能发生。

正确的代码可能是这样的(假设文件是​​文本文件):

char * buf = calloc(filesize + 1, 1);  /* yay, already zeroed! */
fread(buf, 1, filesize, fp);
printf("File contents: '%s'\nFile content size: %u.\n", buf, strlen(buf));

如果你正在阅读任意(“二进制”)文件,这通常不会产生预期的结果(除非你知道会发生什么)。