c - 插入数组期间整数值发生变化
问题描述
我的代码有一些奇怪的问题,我不知道我做错了什么。我对 C 语言比较陌生,所以如果有人能指出我是否在做一些愚蠢的事情,我将不胜感激。
我正在尝试将文件中的数据读取到state类型的二维数组中。类型状态定义如下:
typedef uint8_t state [4][4];
我已经定义了方法read_block,它获取文件指针作为参数并返回指针二维类型状态数组,其中包含该文件的前 16 个字节。
state* read_block(FILE *fp) {
state *arr = (state*) malloc(sizeof (state));
uint8_t *temp = (uint8_t*) malloc(sizeof (uint8_t)*16);
fread(temp, 16, 1, fp);
/*
for (int y = 0; y < 16; y++) {
printf("%u ", temp[y]);
}
printf("\n");
*/
int n = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
/*
printf("%u ", temp[n]);
*/
*arr[i][j] = temp[n];
n++;
}
}
return arr;
}
代码编译运行正常,但是方法返回的类型状态数组总是包含一个错误的值。具体来说,位置 [3][0] 中的值总是错误的。
我正在尝试读取的测试文件包含数字:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
我决定检查这些值是否被正确读取,如果我删除 printf 行周围的注释,我会得到输出:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 3 1 2 3
其中第一行完全正确(即在fread()之后立即打印),但由于某种原因,第二行不正确(即在将值插入arr时打印)。
我无法弄清楚是什么原因造成的。我还尝试使用fread一次读取一个字节的值,但相同的值一直是错误的。我正在使用 NetBeans,所以我不确定这是否是由它引起的。
解决方案
您遇到了运算符优先级。
*arr[i][j]
是相同的
*(arr[i][j]) // or arr[i][j][0]
仅当 时才相同i == 0
,即在第一行中。
你想要的是
(*arr)[i][j]
推荐阅读
- notifications - 网络通知多次出现
- oracle - 具有可变列别名的过程结果 - PLSQL/Oracle
- node.js - 如何在molerjs(Node.js)中转发Post请求?
- python - 在熊猫数据框中连续按给定索引顺序求和值
- react-native - How do I go back in webview? I am using the react-navigation package in react-native
- excel - 将工作表复制保存在以同一工作表中某些特定单元格的内容命名的新工作簿中
- javascript - 在三元运算符中什么都不做
- github - 重命名的文件出现在 Github (remote repo)
- javascript - Async return value from setState
- c++ - 模板类中的 C++ 继承