插入阵列期间整数值发生变化

时间:2018-05-24 08:49:34

标签: c arrays netbeans

我的代码有一些奇怪的问题,我不知道我做错了什么。我对C语言比较陌生,所以如果有人能指出我做的是愚蠢的话,我真的很感激。

我正在尝试将文件中的数据读入 state 类型的二维数组中。类型状态定义如下:

typedef uint8_t state [4][4];

我定义了方法 read_block ,它将文件指针作为参数获取,并返回指针二维类型 state 数组,其中包含该文件的前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;
}

代码编译并运行正常,但方法返回的类型 state 数组总是包含一个错误的值。具体来说,位置[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,所以我不确定这是否是由它引起的。

2 个答案:

答案 0 :(得分:8)

您正在遇到运营商优先权。

public Plan Plan {get; set; }

[Column("Plan_PlanId")]
[ForeignKey("Plan")]
public int PlanId { get; set; } 

相同
*arr[i][j]

仅在*(arr[i][j]) // or arr[i][j][0] 时,即在第一行中,这是相同的。

你想要的是

i == 0

答案 1 :(得分:4)

将数组隐藏在typedef后面并不是一个好主意。这是问题的根源,因为arr实际上是uint8_t (*)[4][4]类型的数组指针。当取消引用数组指针时,您必须首先获取指针的内容以获取数组,然后在访问特定索引之后。也就是说,您必须(*arr)[i][j]而不是*arr[i][j]

为了避免使用这种可疑语法,您可以使用技巧并声明指向最外层维度的数组指针:uint8_t(*)[4]。然后你可以突然输入arr[i][j]arr[i]则意味着对uint8_t(*)[4]类型执行指针运算,然后在获得的结果中,您可以访问特定的数组索引[j]

除了运算符优先级问题之外,您可能还希望将数据直接存储到数组中。您没有理由不能fread(arr, 16, 1, fp);,因为您按照分配的顺序使用该数组。

我还没有对它进行测试,但您应该可以用这个替换整个功能:

void read_block(FILE* fp, uint8_t (*arr)[4][4]) 
{
  const size_t size = sizeof(uint8_t[4][4]);
  *arr = malloc(size);
  fread(*arr, size, 1, fp);
}