C 不确定是什么导致Valgrind读取无效

C 不确定是什么导致Valgrind读取无效,c,arrays,struct,valgrind,C,Arrays,Struct,Valgrind,我有一个功能条*x,uint y和一个结构S,定义如下: typedef struct S { T** arr; uint length; } S; 其中length是arr指针指向的数组的长度,T是其他结构。在代码中初始化结构时,使用calloc动态分配所述数组 现在,在酒吧里,我有一个这样的电话: uint left = y*2+1; uint right = y*2+2; uint boundary = x->length-1; bool left_exists =

我有一个功能条*x,uint y和一个结构S,定义如下:

typedef struct S {
    T** arr;
    uint length;
} S;
其中length是arr指针指向的数组的长度,T是其他结构。在代码中初始化结构时,使用calloc动态分配所述数组

现在,在酒吧里,我有一个这样的电话:

uint left = y*2+1;
uint right = y*2+2;
uint boundary = x->length-1;
bool left_exists = (left <= boundary && x->arr[left]); 
bool right_exists = (right <= boundary && x->arr[right]);
if (left_exists && right_exists) {//do something}

我不确定是什么原因导致了这种情况——如果我真的执行了x->arr[正确],我会理解,但我的代码不阻止这种情况吗?

不要像那样在一行上声明两个bool变量;它使代码不可读,无论是在SO上还是在您的工作或游戏环境中。uint声明行并没有做您可能认为它做的事情,尽管它并不清楚您期望它做什么。但不要像那样使用逗号运算符,这应该是最后的手段;它有它的用途,但这不是一个好的语句,不要把三个语句,其中只有一个是声明,放在一行上。讨厌!恶心,恶心,恶心!!!此外,由于valgrind可以报告问题所在的行号,如果在一行上放置多个语句,则会丢失有关导致问题的语句的宝贵调试信息。@JonathanLeffler:这一点非常重要。我根据你的建议修改了我的问题。好多了。现在,valgrind在哪一行报告这个问题?@JonathanLeffler:正如我在编辑的答案中指出的,bool right_exists=right arr[right];
bool right_exists = (right <= boundary && x->arr[right]);