fread奇怪的副作用-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

fread奇怪的副作用

2016-06-08 22:30:42 2249 1

我写了一个函数,用于从HZK16字库中提取字模:

#include <stdio.h>
#include <stdint.h>

uint16_t *
get_bitmap_font(long offset, const unsigned char *str, uint16_t *data)
{
    unsigned offset_size = 16 * 16 / 8;

    unsigned code_point = (str[0] - 0xA1) * 94 + (str[1] - 0xA1);

    if (str[0] >= 0xA1) {
        offset += code_point * offset_size;
    } else {
        offset += (str[0] + 156 - 1) * offset_size;
    }
    FILE *fp = fopen("HZK16", "rb");
    fseek(fp, offset, SEEK_SET);

    
    printf("before fread: 0x%x 0x%x\n", str[0], str[1]);
    /* 比方说,我提供的参数 str 是一个 GB2312 字符“金” */
    /* 那么此处输出就是对应的编码:0xbd 0xf0 */
    
    fread(data, sizeof(*data), offset_size, fp);
    
    printf(" after fread: 0x%x 0x%x\n", str[0], str[1]);
    /* 输出居然变成了 0x0 0x1 */
    
    
    fclose(fp);
    fp = NULL;
    return data;
}

int
main(void)
{
    unsigned char *str = "\xbd\xf0";
    uint16_t font_data[16];

    get_bitmap_font(0, str, font_data);
    for (int row = 0; row < 16; row++) {
        for (int col = 7; col >= 0; col--) {
            fputs(((font_data[row] >> col) & 1)? "@@": "  ", stdout);
        }
        for (int col = 15; col >= 8; col--) {
            fputs(((font_data[row] >> col) & 1)? "%%": "  ", stdout);
        }
        putchar('\n');
    }
}

    return 0;
}

运行之后,发现这个函数的行为和预期的不同。在检查的过程中,加上了上面的两个printf,发现fread前后str指向的内容居然变了!

但是fread的调用当中并未提到str啊?求解释…

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:32:50

    get_bitmap_font 是如何调用的?

    你向 data 指向的空间写了64个bytes, 是否溢出? data如果没有64, 且 str的空间和 data在一起(比如都在上一层栈中), 那么就把 str 复写了.

    0 0
相关问答

1

回答

C语言中的fread与fwrite问题

2016-03-19 14:06:19 1778浏览量 回答数 1

1

回答

create time 加7天如何写

2016-06-14 11:57:41 1467浏览量 回答数 1

1

回答

C语言break和continue的区别是什么?

2022-03-29 17:34:58 126浏览量 回答数 1

1

回答

continue 和break语句的区别

2016-03-23 14:33:30 1623浏览量 回答数 1

1

回答

微服务具备了哪些特性?

2021-01-14 20:05:36 370浏览量 回答数 1

1

回答

为什么@override不起作用?

2020-01-25 12:45:05 1183浏览量 回答数 1

6

回答

Flask应用如何部署在阿里云上

2015-09-14 17:23:51 14797浏览量 回答数 6

1

回答

datav和阿里云数据连接不了

2018-09-26 11:05:39 1280浏览量 回答数 1

1

回答

C语言中break和continue的区别是什么呀?

2022-03-29 21:15:44 125浏览量 回答数 1

1

回答

linux pthread_create

2016-06-20 16:39:28 1443浏览量 回答数 1
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载