【问题标题】:Why isn't this struct getting set in a function为什么这个结构没有在函数中设置
【发布时间】:2013-11-02 03:33:17
【问题描述】:

我正在尝试将结构指针传递给函数并通过指针初始化结构。知道为什么这不起作用吗?

struct Re
{
    int length;
    int width;
};

void test (Re*);

int main()
{
    Re* blah = NULL;
    test(blah);
    cout << blah->width;
    return 0;
}

void test(Re *t) {
    t = new Re{5, 5};
}

我做错了什么?

【问题讨论】:

标签: c++ pointers struct


【解决方案1】:

指针被复制到函数中,因为它是按值传递的。您必须传递指向指针的指针或指向指针的引用才能对其进行初始化:

void test(Re *&t) {
    t = new Re{5, 5};
}

【讨论】:

  • 效果很好,但我对区别与您是否使用 int 执行此操作有点困惑。我是 C/C++ 的新手,但有人告诉我 stucts 像原始类型一样处理?那么为什么 test(int *t) 可以工作,但结构需要 test(Re *&t) 呢?
  • @user2471908 您必须向我们展示您的 int* 代码,因为我敢打赌它与您上面的代码不同,只是将 Re 更改为 int .
  • @user2471908 如果您像这样使用它:void test(int* t){ *t = 0; } 这是正确的,因为您通过引用传递了 int(因为您传递了 int*),但在这种情况下,您是不尝试初始化Re,您正在初始化Re*,因此您需要对它的引用(Re**Re*&amp;
  • 是的,比如void test(int* t){ *t = 0; }。我很困惑为什么这行得通,但 void test(Re* t) 行不通?
  • void test(Re* t) 只能像@FlowerFire 的答案一样初始化Re 的实例,但您要初始化Re*,而不是Re。如果要初始化 T 类型的实例,则必须传递 T*T&amp;
【解决方案2】:

您没有在函数参数中初始化指针,因为在您的 test() 函数中:

void test(Re *t) {
    t = new Re{5, 5};
}

您没有传递指针的引用。初始化指针对象时需要指针的引用或指向指针的指针。

你也可以这样做:

int main()
{
    Re blah;
    test(&blah);
    cout << blah->width;
    return 0;
}

void test(Re *t) {

  t->length = 5;
  t->width = 5;    

};

【讨论】:

  • 这个答案是完全错误的——你在尊重 NULL 指针。此外,OP 希望在函数 test 中对 blah 所做的任何更改在它返回后仍然存在。您的代码示例没有这样做。
  • @greatwolf 我的想法没有错,我仍然可以在我的void test(Re* t) 函数中初始化我的指针对象(正如 Boris Vidolov 指出的那样)。我忘记提到的是在main() 中传递一个用于测试目的的指针引用。不过谢谢你的指出。
  • 最好将代码示例留在外面,因为它仍然错误(blah-&gt;width 不会编译)。
猜你喜欢
  • 2011-09-15
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多