函数会自动 return 动态分配变量吗?
does a function automatically return dynamically allocated variable?
在研究树数据结构时,我遇到了这段按顺序遍历树的代码
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* left;
struct node* right;
};
struct node* newNode(int data)
{
struct node* node = (struct node*)malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void printPreorder(struct node* node)
{
if (node == NULL)
return;
printf("%d ", node->data);
printPreorder(node->left);
printPreorder(node->right);
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf("\nPreorder traversal of binary tree is \n");
printPreorder(root);
getchar();
return 0;
}
在函数 newNode(int data) 中,即使我们删除了 return 语句,代码也能正常工作。
所以,我的问题是函数 newNode 是自动 returning 节点变量还是发生了其他事情?
感谢任何帮助。谢谢!
如果函数被定义为 return 一个值但没有这样做,并且调用函数试图使用 return 值,则您调用了 undefined behavior.
在您的情况下,该程序似乎可以正常运行。这是未定义行为表现出来的方式之一。这可能会随着程序的不相关更改而改变,例如添加额外的局部变量或调用 printf
进行调试。
如果函数说它 return 是一个值,你应该确保它 总是 return 是一个值。
在研究树数据结构时,我遇到了这段按顺序遍历树的代码
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* left;
struct node* right;
};
struct node* newNode(int data)
{
struct node* node = (struct node*)malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void printPreorder(struct node* node)
{
if (node == NULL)
return;
printf("%d ", node->data);
printPreorder(node->left);
printPreorder(node->right);
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf("\nPreorder traversal of binary tree is \n");
printPreorder(root);
getchar();
return 0;
}
在函数 newNode(int data) 中,即使我们删除了 return 语句,代码也能正常工作。 所以,我的问题是函数 newNode 是自动 returning 节点变量还是发生了其他事情?
感谢任何帮助。谢谢!
如果函数被定义为 return 一个值但没有这样做,并且调用函数试图使用 return 值,则您调用了 undefined behavior.
在您的情况下,该程序似乎可以正常运行。这是未定义行为表现出来的方式之一。这可能会随着程序的不相关更改而改变,例如添加额外的局部变量或调用 printf
进行调试。
如果函数说它 return 是一个值,你应该确保它 总是 return 是一个值。