0

我想检查是否tab[i][j + 1]存在,它是一个 int **tab;

if (tab[i][j + 1] && tab[i][j + 1] == a_value)
    tab[i][j + 1] = 1;
printf("%d\n", tab[i][j + 1]);

它打印我a_value,但如果我起飞tab[i][j + 1]

if (/*tab[i][j + 1] && */tab[i][j + 1] == a_value)
        tab[i][j + 1] = 1;
    printf("%d\n", tab[i][j + 1]);

它打印我1

为什么我不能检查是否tab[i][j + 1]存在?

这是我将地图放入数组的位置

while (tmp != 22)
    {
      ln = read(fd, buff, 22);
      buff[ln] = '\0';
      while (buff[k] != '\0')
        {
          if (buff[k] == 'x')
            tab[i][j] = WALL;
          else if (buff[k] == ' ')
            tab[i][j] = 0;
          else if (buff[k] == 'e')
            tab[i][j] = ENTRE;
          else if (buff[k] == 's')
            tab[i][j] = SORTIE;
          k++;
          j++;
        }
      k = 0;
      tab[i][j] = -5;
      j = 0;
      i++;
      tab[i] = malloc(sizeof(*tab) * 2000);
      tmp++;
    }

这是地图

xxxxxxxxxxxxxxxxxxxxx
xxx                 s
xxx xxxxxxxxxxxxxxxxx
xxx xxxxxxxxxxxxxxxxx
xxx xxxxx xxxxxxxxxxx
xxx xxxxx xxxxxxxxxxx
xxx xxxxx           x
xx  xxxxx x   xxxxx x
xx xxxxxx xxx xxxxx x
xx        xxx xxxxx x
xxxxxxxxx xxx xxxxx x
xxxxxx        xxxxx x
xxxxxxxxx xxx   xxx x
xxx        xxxx xxx x
xxxxx xxx xxxxx xxx x
xxxxx xxx  xxxx xxx x
xxx   xxxx xxxx  xx x
xxxx xxxxx xxxxx xx x
xxxx xxx   xxxxx xx x
xxxx     xxx      xxx
xxxxxxxxexxxxxxxxxxxx
4

4 回答 4

3

该表达式tab[i][j + 1] && tab[i][j + 1] == 0等价于tab[i][j + 1]!=0 && tab[i][j + 1] == 0which is不可能,因此解析为 false (0)。

为什么等同于这个?因为一个语句if(someStmt)等价于if(someStmt!=0),因为在 C 中假定任何不同于零的数字true,而零是false

于 2013-10-22T13:20:30.893 回答
3

(因为有很多答案解释了你的矛盾,if所以我会跳过。)

您无法检查是否tab[i][j + 1]存在,因为 C 不维护有关 ( malloced) 指针大小的信息(好吧,除了指针大小,我说的是该指针后面的缓冲区大小)。如果tab是一个正确的数组,您可以使用它sizeof来检查索引是否小于该值。但是,正如您声明tab的那样,int **此信息已丢失。

简而言之:您需要记录tab某处的尺寸或将其声明为数组,例如:

int tab[4][5];

然后,您可以使用类似这样的方法来检查数组中的某个索引是否在界内:

#define isAllocated(array, index) (index < sizeof(array))

并像这样使用它:

if(isAllocated(tab[i], j+1) && tab[i][j + 1] == 0){ ...
于 2013-10-22T13:37:12.320 回答
2

这是因为条件tab[i][j + 1] && tab[i][j + 1] == 0永远是false。一次tab[i][j + 1]将包含非零值或零值。

于 2013-10-22T13:13:50.297 回答
1

考虑tab[i][j+1]0

if (tab[i][j + 1] && tab[i][j + 1] == 0) will result in if(0 && 1)/if(false && true) == if (0)/if(false)

因此赋值语句tab[i][j + 1] = 1; 不执行并且tab[i][j+1]值打印= 0(我假设)

if (/*tab[i][j + 1] && */tab[i][j + 1] == 0) will result in if(1)/if(true) 

所以赋值语句tab[i][j + 1] = 1; 执行并输出1

于 2013-10-22T13:19:15.003 回答