【问题标题】:Need help to understand the output of this code需要帮助来理解此代码的输出
【发布时间】:2011-11-01 02:56:37
【问题描述】:

看我的代码是

#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

现在的问题是如果 size 是 20 那么为什么 length 是 21 ?

【问题讨论】:

    标签: c


    【解决方案1】:

    因为 C 没有原生字符串,只有字符数组,并且存在一个隐藏的、普遍存在的假设,即最后一个数组成员为零。

    因为你违反了这个假设,只将 20 个字节读取到一个 20 个元素的数组中,而不考虑最后一个字节是否为零,然后使用像 %s 和 @987654322 这样的 string 特性@,你会得到本质上未定义的行为。

    得到 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));
    

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

    【讨论】:

    • “更糟”的范围从细分违规到信息泄露。
    • @ninjalj:这是编程错误的典型示例,它是数百个严重可利用漏洞的核心概念可能是了解 C 最重要的方面之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2021-07-29
    相关资源
    最近更新 更多