Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这段代码安全吗(为什么没有崩溃)?_C++_C - Fatal编程技术网

C++ 这段代码安全吗(为什么没有崩溃)?

C++ 这段代码安全吗(为什么没有崩溃)?,c++,c,C++,C,我看到了列表合并排序的解决方案: struct Node* SortedMerge(struct Node* a, struct Node* b) { struct Node* result = NULL; /* Base cases */ if (a == NULL) return(b); else if (b==NULL) return(a); /* Pick either a or b, and recur */ if (a->data

我看到了列表合并排序的解决方案:

struct Node* SortedMerge(struct Node* a, struct Node* b)
{
  struct Node* result = NULL;

  /* Base cases */
  if (a == NULL)
     return(b);
  else if (b==NULL)
     return(a);

  /* Pick either a or b, and recur */
  if (a->data <= b->data)
  {
     result = a;
     result->next = SortedMerge(a->next, b);
  }
  else
  {
     result = b;
     result->next = SortedMerge(a, b->next);
  }
  return(result);
}
struct Node*SortedMerge(struct Node*a,struct Node*b)
{
结构节点*result=NULL;
/*基本情况*/
如果(a==NULL)
返回(b);
else如果(b==NULL)
报税表(a);
/*选择a或b,然后重复出现*/
如果(a->数据)
{
结果=a;
结果->下一步=分类麦格(a->下一步,b);
}
其他的
{
结果=b;
结果->下一步=分类麦格(a,b->下一步);
}
返回(结果);
}
而且它似乎不安全,因为
struct Node*result
是在堆栈上分配的,从函数调用返回后需要释放

我检查过了,它工作正常(没有崩溃)


那么代码安全吗?为什么呢?

只要您没有动态分配它,您就没有责任取消分配它。我不明白为什么这会失败,仅仅因为它在
堆栈上

这不会导致错误

如果在每次调用函数时分配结果,然后不释放它,这将是很糟糕的,因为这将导致内存泄漏


如果您试图从函数返回一个局部变量的地址,也会出错。

不完全是这样,只有变量结果在堆栈中分配,但实际内存仍在堆中,更多的是在堆栈中分配

 struct Node* result = NULL;
下面的这些语句只是指向指针a或b所指向的内存或SortedMerge()返回的内存的指针

这些可能是在堆中或由被调用函数的本地分配内存分配的,在这种情况下,只要调用函数作用域存在,内存就仍然存在


返回局部变量的地址是一个错误,但是传递局部变量的地址被认为是完全正确的。

如果您担心递归会破坏堆栈,那么您是对的;在大多数情况下,最大堆栈大小是有限的(例如,在Windows x64上,默认为1MB)

因此,在清理堆栈之前,最多可以递归32767次(假设堆栈上至少还需要存储返回地址)


这就是为什么您应该避免对用户提供的数据进行递归,而更喜欢迭代

result
是一个指针。函数的返回值不是指向
结果的指针。相反,它是指向
result
也指向的对象的指针?提供一些确保检查SortedMerge调用返回是否为空。如果a和b都为null,则返回b(null)。关于标题中的问题,虽然我不知道“安全”的含义是什么,但几乎可以肯定,它的含义不仅仅是“我运行它时它没有崩溃”。
result = a;
result->next = SortedMerge(a->next, b);
result = b;
result->next = SortedMerge(a, b->next);