从函数返回后,指针为NULL

时间:2014-02-19 16:13:39

标签: c++ function pointers

我将int ***发送到一个函数并且该函数完成它的工作,但是当我尝试在函数之后使用外部的指针时,它是NULL。这是功能:

void pointerSort2(int* arr, unsigned int size, char ascend_flag, int*** pointers)
{
    int  i, j, *temp;
    int** sort=new int*[size];

    for (i=0;i<size;i++)
        sort[i]=&arr[i];                                                     

    if (ascend_flag==true)
    {
        for (i=0;i<size-1;i++)
        { 
            for(j=0; j<size-1-i;j++)
            {
                if (*sort[j]>*sort[j+1])
                {
                    temp=sort[j];
                    sort[j]=sort[j+1];
                    sort[j+1]=temp;
                }
        }
    }

    pointers=&sort;
}

当我尝试使用它之后,指针是“0x000000(???)”

3 个答案:

答案 0 :(得分:6)

函数参数int*** pointers是函数的局部变量。退出函数后,此变量将被销毁。

我认为不是行

pointers=&sort;

应该有

*pointers = sort;

答案 1 :(得分:2)

首先,如果这不是作业,那么容器和算法已经存在,将为您完成所有这些:

容器:std::vectorstd::liststd::deque 排序算法:std::sort

只需使用标准库模板即可解决大多数问题。

除此之外,您似乎也没有很好地理解传值和传递引用以及指针语义之间的区别。

int***传递给采用int***

的函数

如果将函数声明为

void func(int i);

并称之为:

int j = 0;
func(j);

funci参数所做的任何内容都不会反映在j中。 j副本将传递给func。如果您想存储对func参数所做的任何更改i,则需要使用引用或指针:

void func(int& i);
// or
void func(int* pI); // requires you to call it via func(&j)

您当前的代码也是如此:

您已声明您的排序功能如下

void pointerSort2(..., int*** pointers);

如果你这样称呼它

int*** myPointer = NULL;
pointerSort2(..., myPointer);

你是按价值传递的。这会将指针(当前为NULL)的值复制到函数的局部变量pointers中。函数返回时,myPointer保持不变。如果您的目标是将更改的值保留在myPointer中,则需要通过引用传递或将指针传递给int***(注意:此级别的间接已经是代码味道!)对此的潜在解决方案是:

void pointerSort2(..., int***& pointers);
// or
void pointerSort2(..., int**** pointers);

这将允许您以这些方式(分别)调用该函数:

int*** myPointer = NULL;
pointerSort2(..., myPointer);
// or
pointerSort2(..., &myPointer);

对于第一个版本,您可以将pointers的值设置为sort的值,如下所示:

pointers = sort;

由于pointersmyPointer的引用(别名),myPointer的值会发生变化。

对于第二个版本,您可以将pointers的值设置为sort的值,如下所示:

*pointers = sort;

由于pointers是指向myPointer位置的指针,因此您需要设置myPointer的实际值。

请注意,在这两种情况下,您都要将值设置为sort(指针的值),不是 &sort(指针的地址)。< / p>

旁注

bool是一种用于truefalse值的类型。您的ascend_flag参数最好用bool代替char

答案 2 :(得分:1)

以下一行:

pointers = &sort;

导致您的问题。 sort是指向指针的指针。因此,它是在函数的局部范围内创建的变量。

函数退出时会被破坏。

尝试删除&

我们想要转到本地指针变量,找到它指向的内容,并更改该值。 指针不是通过引用传递的,它与任何其他参数一样,是在堆栈上的每个运行时函数调用中复制和销毁的。

*pointers = sort;