fscanf读取文件问题

ShaoHilo 2013-04-16 09:37:18
一个奇怪的C语言问题,求高手解释:

fp_key = fopen("key.txt", "r"); //只读打开key.txt
if(fp_key == NULL) return 1; //检查是否正常打开
uint8_t key[KEYSIZE] = {0}; //定义一个数组,保存从key.txt中读到的数据
for( i = 0; i < KEYSIZE; i++) {
int j = 0;
j = fscanf(fp_key, "%i", &key[i]); //由于key.txt中为16进制,故用%i格式读取
}

key.txt中内容是oxff空格0xff...共KEYSIZE(8)个。
结果是循环变量i到了5以后,执行完fscanf后突然变成了0,然后重新开始循环,这一次循环i正常从0递增到8。
当我将key数组定义为全局变量的时候,不会出现上述问题,求高手解释啊!
...全文
164 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShaoHilo 2013-04-17
  • 打赏
  • 举报
回复
引用 5 楼 lin5161678 的回复:
引用 4 楼 haibin_shao 的回复:引用 3 楼 lin5161678 的回复:引用 2 楼 haibin_shao 的回复:key[i]是1个字节。调试过程中key[0]和key[5]能正常初始化。当key[5]正确读取后,i就突然变成了0,后续的操作就开始不正确了。如果%i给4个字节写数据,那一开始就会出错吧请点我有右下角的引用 我才能看到你和我说话 ……
恩,多谢你花了时间解答。
lin5161678 2013-04-17
  • 打赏
  • 举报
回复
引用 4 楼 haibin_shao 的回复:
引用 3 楼 lin5161678 的回复:引用 2 楼 haibin_shao 的回复:key[i]是1个字节。调试过程中key[0]和key[5]能正常初始化。当key[5]正确读取后,i就突然变成了0,后续的操作就开始不正确了。如果%i给4个字节写数据,那一开始就会出错吧请点我有右下角的引用 我才能看到你和我说话 你这里的内存分配 是这样的(注意内存分配在不同……
谁也不敢保证后面的是无关紧要 还是其他对象的值 还是别的什么 最好是做到不越界
ShaoHilo 2013-04-17
  • 打赏
  • 举报
回复
引用 3 楼 lin5161678 的回复:
引用 2 楼 haibin_shao 的回复:key[i]是1个字节。调试过程中key[0]和key[5]能正常初始化。当key[5]正确读取后,i就突然变成了0,后续的操作就开始不正确了。如果%i给4个字节写数据,那一开始就会出错吧请点我有右下角的引用 我才能看到你和我说话 你这里的内存分配 是这样的(注意内存分配在不同环境下 不一样 这里是具体到你的问题做分析的……
恩,应该是你说的问题,现在我先用临时变量将数据读出来,然后再赋值给key数组,就不会出现上述问题。 我之前将key数组定义为全局变量的时候也没有出现上述问题,应该是key数组在静态存储区最后位置,后面一些值无关紧要吧?
lin5161678 2013-04-16
  • 打赏
  • 举报
回复
引用 2 楼 haibin_shao 的回复:
key[i]是1个字节。调试过程中key[0]和key[5]能正常初始化。当key[5]正确读取后,i就突然变成了0,后续的操作就开始不正确了。如果%i给4个字节写数据,那一开始就会出错吧
请点我有右下角的引用 我才能看到你和我说话 你这里的内存分配 是这样的(注意内存分配在不同环境下 不一样 这里是具体到你的问题做分析的时候 内存分配如下) [key0][key1][key2][key3][key4][key5][key6][key7][i] 第一次是写[key0][key1][key2][key3] 第二次是写[key1][key2][key3][key4] 第三次是写[key2][key3][key4][key5] 第四次是写[key3][key4][key5][key6] 第五次是写[key4][key5][key6][key7] 第六次是写[key5][key6][key7][key8]//循环i从0开始 i的值是5 那么是第6次 你说你你读取到的数据是0xff 在小端机器上 0xff通过%i写入内存是 0xff 0x00 0x00 0x00 [key5][key6][key7][key8] 这里 可以看到有向key8写入0x00 已经越界 那么key8是哪里 在这里key8 恰好是i的4个字节中的最高字节 i的值是5在内存中的表示为 0x05 0x00 0x00 0x00 向key8写入0x00 把原来的0x05 变成0x00 i的值在内存中是 0x00 0x00 0x00 0x00 就是你说的i的值是0
ShaoHilo 2013-04-16
  • 打赏
  • 举报
回复
key[i]是1个字节。调试过程中key[0]和key[5]能正常初始化。当key[5]正确读取后,i就突然变成了0,后续的操作就开始不正确了。如果%i给4个字节写数据,那一开始就会出错吧
lin5161678 2013-04-16
  • 打赏
  • 举报
回复
越界了 你的key[i]才1个字节吧 %i会给4个字节写数据

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧