【问题标题】:Unexpected behavior in array comparison数组比较中的意外行为
【发布时间】:2017-10-01 15:24:02
【问题描述】:

我正在尝试比较表示矩阵的二维数组中的数据。 由于它是一个稀疏矩阵,我创建了二维数组 compactMatrix,其中包含值矩阵入口不为空的行和列。

我正在使用此代码进行比较:

    if(compactMatrix[0][i] == compactMatrix[1][k] &&
       compactMatrix[1][i] == compactMatrix[0][k]){

        Do stuff...
    }

ik 是我目前在forloop 中查看的索引。 要知道,我调试了compactMatrix[0][i]compactMatrix[1][k]compactMatrix[1][i]compactMatrix[0][k]的值确实相等。

尝试使用打印值

    j = compactMatrix[0][i];
    l = compactMatrix[1][i];
    printf("%i %i", &j, &l);

但它给了我指针地址,我猜。

所以,我想知道为什么它在 if 子句中返回 false 以及如何正确修复它。

【问题讨论】:

  • 严格来说,这个printf("%i %i", &j, &l);会导致UB。
  • 不要描述您的代码,但显示minimal reproducible example
  • 应该是printf("%i %i", j, l);
  • 你们真的没有明白我在问什么。我问的是 if 子句,而不是 print。
  • @MichaelWalz,我提供了一个最小、完整和可验证的 if 子句示例,它给出了 UB

标签: c arrays matrix multidimensional-array


【解决方案1】:

printf 仅用于输出不需要地址的值。此外,当您尝试以整数格式打印地址时,它的行为未定义。该标准要求您使用%p 打印地址。

正如 CS Pei 在 cmets 中提到的,你需要的可能是这样的:

printf ("%i %i",j,l);// you can use %d and %i interchangeably.

标准本身对%p 的一些额外说明:

对应的参数应该是一个指向void的指针。 输入项被转换为一个指针值 实现定义的方式。如果输入项是转换后的值 在同一程序执行的早期,结果的指针 应比较等于该值;否则 %p 的行为 转换未定义。

因此,如果您确实使用 p 说明符,请不要忘记将参数转换为 void*

【讨论】:

  • 这不是我的问题的答案。而且我不想打印地址,我试图打印内容只是为了再次验证 IF CLAUSE 应该有效,但事实并非如此。
  • 我不明白,你自己刚才说数组的元素确实是相等的。我们可以在上述问题中找到的唯一问题是打印问题
  • 您都阅读了吗? “所以,我想知道为什么它在 if 子句中返回 false 以及如何正确修复它。”。当它应该返回 true 时它返回 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多