修改函数内的数组指针

时间:2013-11-01 20:45:20

标签: c++ arrays pointers

    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

6 个答案:

答案 0 :(得分:3)

您需要通过指针传递指针(或者其他人指出对指针的引用),即int **,然后使用*buffer = temp进行分配,并使用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 consecutive unsigned integers

答案 1 :(得分: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指针本身仍然是本地的。

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

答案 2 :(得分:0)

a通过值传递给任何值,因此在没有任何内容的情况下更改它的副本对a没有影响。你必须通过引用传递,或者像@villintehaspam所说的那样传递一个指向指针的指针。

答案 3 :(得分:0)

“我正在尝试将数组(指针)传递给函数并在”

中修改它

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

尝试传递int**而不是int*并让来电者执行:

int* a;
nothing(&a);

另请注意,在C ++中,一个函数动态分配一些资源并以负责释放这些资源的负担(即使使用特定方法,在这种情况下调用{{1调用者。考虑使用delete[]之类的STL容器,或者如果你必须坚持使用C风格的数组,那么至少需要那些具有自动存储持续时间的容器。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

void nothing(int*& buffer)

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