指针从函数返回后为NULL
Pointer is NULL after returning from a function
我向一个函数发送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(??)">
函数参数int*** pointers
是函数的局部变量。此变量将在退出函数后销毁。
我认为这不是线
pointers=&sort;
应该有
*pointers = sort;
首先,如果这不是用于分配,那么已经存在将为您完成所有这些的容器和算法:
容器:std::vector
、std::list
、std::deque
排序算法:std::sort
大多数问题只需使用标准库模板即可解决。
除此之外,您似乎也没有很好地理解按值传递和按引用传递之间的区别以及指针语义。
将int***
传递给接受int***
的函数
如果您将函数声明为
void func(int i);
并称之为:
int j = 0;
func(j);
func
对i
参数所做的任何事情都没有反映在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;
由于pointers
是对myPointer
的引用(别名),因此myPointer
的值被改变。
对于第二个版本,您可以将pointers
的值设置为sort
的值,如下所示:
*pointers = sort;
由于pointers
是指向myPointer
位置的指针,因此您正在设置myPointer
的实际值。
请注意,在这两种情况下,都将值设置为sort
(指针的值),而不是&sort
(指针的地址)。
旁注
CCD_ 32是用于CCD_ 33和CCD_ 34值的类型。您的ascend_flag
参数最好用作bool
,而不是char
。
以下行:
pointers = &sort;
导致了您的问题。CCD_ 38是指向指针的指针。因此,它是在函数的局部范围内创建的变量。
当函数退出时,它会被销毁。
尝试移除&
我们想转到本地指针变量,找到它指向的内容,然后更改该值。指针不是通过引用传递的,它和任何其他参数一样,在堆栈上的每个运行时函数调用中都会被复制和销毁。
*pointers = sort;
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- 如何返回值为NULL的变量指针
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- GDALOpen 在 GEOTiff 文件上返回 null
- 将对象作为 null 返回内容
- QList<float* 类型的 NULL 返回值>
- 在用C++编写的COM客户端中引发异常的Null返回值
- nullptr初始值和WinAPI NULL返回
- DirectX pEnum->Next(1,&pPin,NULL) 返回S_FALSE