c++ - Address-of(&) 运算符传递的无效指针

标签 c++ c++11 visual-c++

好吧,我正在练习 C++ 类和指针。突然间就... 如果我尝试获取在参数中传递的对象的地址,它会给我一个无效地址。

这是怎么回事?

P.S 你可以忽略 if 语句,它不应该与这个特定问题相关。 Picture of the Problem .

int ChainLinkz::chainCount = 0;

ChainLinkz::ChainLinkz(int i) {
    data = i;
    chainID = chainCount++;
    fLink = this;
    addr = this;
    nLink = 0;
    printf("Created Link with Value: %i  Addr: %x.\n", data, this);
}

ChainLinkz *ChainLinkz::next() {
    if (nLink)
        return nLink;
    else
        return 0;
}

ChainLinkz *ChainLinkz::last() {
    ChainLinkz * lastLink = fLink;
    while (lastLink->next()) {
        lastLink = lastLink->next();
    }
    return lastLink;
}

ChainLinkz ChainLinkz::addLink(ChainLinkz link) {
    if (link.nLink) {
        if (&link == link.fLink) { // Replace fLink with new address in all instances of previous chain | Fix the old chain
            ChainLinkz *t_link = link.nLink;
            while (t_link->next()) {
                t_link = t_link->next();
                t_link->fLink = link.nLink;
            }
        } else { // Replace nLink for previous link | Fix the old chain
            ChainLinkz *t_link = link.fLink;
            while (t_link != &link)
                t_link = t_link->next();
            t_link->nLink = link.next();
        }
    }
    last()->nLink = link.addr;
    printf("\n&link: %x   |    Real Addr: %x \n\n", (ChainLinkz*)&link, link.addr);
    link.nLink = 0; //Update values to new chain
    link.fLink = fLink;

    return link;
}

ChainLinkz ChainLinkz::addLink(ChainLinkz *link) {
    printf("Overloader: %x.\n", link);
    return addLink(*link);
}

ChainLinkz ChainLinkz::operator>>(ChainLinkz link) {
    return addLink(link);
}
ChainLinkz ChainLinkz::operator>>(ChainLinkz *link) {
    printf("Overloader: %x.\n", link);
    return addLink(*link);
}

最佳答案

通过使用引用而不是传递对象本身解决了这个问题。

ChainLinkz ChainLinkz::addLink(ChainLinkz &link) {
    printf("Overloaded New: %p\n", &link);
    return addLink(&link);
}

ChainLinkz ChainLinkz::addLink(ChainLinkz *link) {
    if (link->nLink) {
        if (link == link->fLink) { // Replace fLink with new address in all instances of previous chain | Fix the old chain
            ChainLinkz *t_link = link->nLink;
            while (t_link->next()) {
                t_link = t_link->next();
                t_link->fLink = link->nLink;
            }
        }
        else { // Replace nLink for previous link | Fix the old chain
            ChainLinkz *t_link = link->fLink;
            while (t_link != link)
                t_link = t_link->next();
            t_link->nLink = link->next();
        }
    }
    last()->nLink = link;
    link->nLink = 0; //Update values to new chain
    link->fLink = fLink;
    return *link;
}

ChainLinkz ChainLinkz::operator>>(ChainLinkz &link) {
    return addLink(&link);
}
ChainLinkz ChainLinkz::operator>>(ChainLinkz *link) {
    printf("Overloaded: %p.\n", link);
    return addLink(link);
}

关于c++ - Address-of(&) 运算符传递的无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350575/

相关文章:

c++ - 从 Mat 元素到 IplImage * 的 opencv 转换

c++ - 直接执行数据

c++ - 交换互斥锁

c++ - bool返回值的函数,只设置整个寄存器的1个字节

c++ - 用mingw和msys把VC++库转成mingw库?

c++ - 如果类也有非虚方法,模拟纯虚方法?

c++ - 了解 C++ 中的以下数据类型

android - Qt 5.7 for Android 主 C++ 线程不连续运行

c++ - SleepEx 是否保证在超时之前调用所有挂起的完成回调?

c++ - 区分 const char[N] 和 std::string 的类型特征?