1
    void nothing(int* buffer)
    {
        int* temp = new int[5];
        for (int i = 0; i < 5; i++)
        {
            temp[i] = i;
        }
        buffer = temp;
    }

    void main(int argc, char* argv[])
    {
        int* a = new int;
        nothing(a);
        for (int i = 0; i < 5; i++)
        {
            cout << a[i] << endl;
        }
        system("pause");
    }

为什么我不能从缓冲区获取新地址?我正在尝试将数组(指针)传递给函数并在内部修改它。

输出:

 -842150451
-33686019
-1414812757
-1414812757
0

预期的:

0
1
2
3
4
4

6 回答 6

3

您需要通过指向指针的指针(或其他人指出对指针的引用),即int **然后分配 using*buffer = temp和调用函数 using nothing(&a)

如果您不这样做,您对缓冲区变量所做的更改会在您离开该函数时丢失。将指针变量本身想象成任何数字,因为它指向的东西在函数结束后仍然存在。

但是,我建议您改用 std::vector :

void nothing(std::vector<int> &buffer) {
    ...
}

int main(int argc, char* argv[])
{
    std::vector<int> a;
    nothing(a);
    for (int i = 0; i < 5; i++)
    {
        cout << a[i] << endl;
    }
    system("pause");
    return 0;
}

根据您的情况,您甚至可能希望将 nothing 函数更改为初始化程序样式函数,即直接返回一个对象:

std::vector<int> nothing() {
    std::vector<int> temp;
    // fill vector here
    return temp;
}

int main(int argc, char* argv[])
{
    auto a = nothing();
    for (int i = 0; i < 5; i++)
    {
        cout << a[i] << endl;
    }
    system("pause");
    return 0;
}

这更像是 C++-ish,并且可以防止您必须手动处理删除数组。

要实际将数据生成到向量中,请查看Initialization of std::vector<unsigned int> with a list of continuous unsigned integers

于 2013-11-01T20:47:56.167 回答
1

重要前奏:如果可以的话,使用vector而不是数组/指针。我们都会尽可能地鼓励这一点!很可能连续数月编程,编写一些相当复杂的软件,而不必调用newdelete不必担心所有那些讨厌的 C 问题。


停止使用temp

void nothing(int* buffer)
{
    for (int i = 0; i < 5; i++)
    {
        buffer[i] = i;
    }
}

这将采用指向您的数组的指针作为输入。然后它将直接写入该数组。

您之前的代码创建了第二个数组。每次你打电话new都会得到一个新的数组。int* temp = new int[5];. 要使这种方法起作用,您需要将临时数组中的数据复制到缓冲区数组。但是,您不能(轻松地)在 C 中复制数组。

buffer = temp;  // This *doesn't* copy any array

这条线什么也没做。这两个数组仍然存在,因此没有数据被复制。这里修改了调用的局部变量buffer;但变化很小——缓冲区曾经指向旧数组,现在它指向新数组。而且因为 buffer 是一个局部变量,所以一旦函数返回它就失去了所有意义(它指向非本地数据,但buffer指针本身仍然是本地的。

简而言之,您的原始nothing功能没有任何用处。它创建了一个新数组,将一些值放入其中,然后忽略它。里面的缓冲区变量main不受您的函数的影响。

于 2013-11-01T21:12:02.043 回答
0

指针buffer是按值传递的(这是 c++ 中的默认值),这意味着创建了一个副本。然后,您修改此副本。这是 c++,你可以传递一个引用:

void nothing(int*& buffer)

这样,原始对象被传递,而不是副本。

于 2013-11-01T20:55:16.883 回答
0

a 是按值传递的,因此将它的副本更改为 nothing 对 a 没有影响。如果通过引用,您必须通过,或者正如@villintehaspam 所说,将指针传递给指针。

于 2013-11-01T20:48:41.580 回答
0

“我正在尝试将一个数组(指针)传递给函数并在里面修改它”

但是您的代码所做的是它为 1 分配内存int,将指向该内存的指针传递给您的函数,并且您的函数分配一个数组并尝试将地址或这个新分配的数组分配给传递的指针,即它尝试修改指针本身

尝试通过int**而不是int*让调用者做:

int* a;
nothing(&a);

另请注意,在 C++ 中,函数动态分配一些资源并以释放这些资源的责任形式(即使使用特定方式,在本例中为调用delete[])给调用者带来负担,这应该比常见的做法更罕见。考虑使用 STL 容器,例如std::vector或者如果您必须坚持使用 C 样式的数组,那么至少更喜欢那些具有自动存储持续时间的容器。

于 2013-11-01T20:49:36.953 回答
0

temp是一个局部变量,在 nothing() 中声明。这意味着 temp 的内存在 nothing() 返回时丢失。您无法从局部变量中取回数据 - 因此是垃圾。

于 2013-11-01T20:50:31.647 回答