【问题标题】:Debug Assertion Fail, result_pointer != nullptr调试断言失败,result_pointer != nullptr
【发布时间】:2020-06-24 01:18:32
【问题描述】:

我正在用 C 语言编写这个获取联系信息的程序。我将struct 中的struct 的指针传递给一个获取地址信息的函数,但是当将信息扫描到指针位置时,我得到一个调试错误。

这是我的代码:

void getAddress(struct Address* address)
{
    // Street Number
    do  // Validate the street number
    {
        printf("Please enter the contact’s street number: ");
        scanf("%d", address->streetNumber); //<----where the error is
    } while (address->streetNumber <= 0);

    clearIS();    // Clears input stream

【问题讨论】:

  • 传递一个指向streetNumber的指针,而不是变量的值:scanf("%d", &amp;address-&gt;streetNumber);
  • 您显示的代码中没有断言。
  • @jarmod 它可能是scanf的库实现中的东西
  • @M.M 看起来确实如此,也许就像address-&gt;streetNumber 为零一样简单。我很惊讶地看到断言在运行时库中处于活动状态。

标签: c pointers scanf


【解决方案1】:

简而言之,您应该添加&amp;(address-&gt;streetName),一切都会好起来的。

这种行为的主要原因是scanf 期望您将指针传递给它应该写入输入的内存位置。

在您当前的代码中,您对 scanf 说将 32 位用户信息写入以 address-&gt;streetName 开头的地址的内存中,这不是您想要做的。

address-&gt;streetName 相同的东西可以正常工作,因为我猜你将一个指向字符数组的指针传递给scanf。因为address-&gt;streetName 在您的结构中定义为char*char[N]

【讨论】:

  • &amp;(address-&gt;streetName) 中的括号是不必要且非惯用的。
  • 我同意它们是多余的。我添加它们以明确显示我们想要streetName 的地址。
  • . 和箭头 -&gt; 运算符绑定得非常紧密 - 比一元 &amp; 绑定得更紧密。如果省略括号,则没有歧义。正如我所说,它们是不必要的和非惯用的,但它们并没有错。但是不要将代码发送给我以供审查,其中包含括号中的那些。
猜你喜欢
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多