开发平台(Platform): (Ex: Win10, Linux, ...)
GNU/Linux Ubuntu
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Vim
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
n/a
问题(Question):
最近在练习资料结构,
突然想到有关于在函式中回传区域变量的问题
不知道该怎解决,所以想问一下实际上遇到这种问题的最好的解法
喂入的资料(Input):
程式码如下
预期的正确结果(Expected Output):
输出没问题
错误结果(Wrong Output):
没错误
程式码(Code):(请善用置底文网页, 记得排版)
/*List 结构类型*/
typedef struct node {
struct node* next;
char* id;
}List;
/*全域变量 head*/
List head = {NULL , "head"};
/*经由 get_last_node() 函式,可以回传 linked list 的最后一个 node 的指标*/
List* get_last_node(void){
if( head.next == NULL ){
return &head;
}
List* current = head.next;
while( current != NULL ){
if( current->next == NULL ){
return current; //我的问题就是这一行 Question,问题在下方补充
}
current = current->next;
}
}
void add_new_node(char* id){
List* last_node = get_last_node();
//....接着去 malloc 新空间 跟 新增 node 等等的动作
}
void main(){
List n1 = {NULL , "n1"};
head.next = &n1;
List n2 = {NULL , "n2"};
n1.next = &n2;
add_new_node("another new node");
/*基本上这个程式,写到这边没有发生什么错误*/
/*那这边要取得最后 node 的指标是为了更后面要实做 add_new_node() 的函式*/
}
补充说明(Supplement):
就是 current 区域变量是在 get_last_node() 函式里面
经由一开始取得 head.next 之后,在由 while loop 来得到最后一个 node 的指标
可是因为回传的是 current 区域变量,
回传的时候,理论上 get_last_node() 在内存的空间应该已经被释放掉了,
所以我的 main 函式可以收到正确的 current 内容,应该是运气好内存内容还没被覆蓋掉;
我看了一些 c 语言的教学,都说回传区域变量是不好的习惯
但是在这个 case,不回传区域变量的解决方式似乎只有两种
第一种:
就开一个全域变量 (可是全域变量会造成命名冲突的可能)
第二种:
不回传指标,所以后续的所有动作都在同一个函式里面做完,
current 取得指标之后,就在 get_last_node() 同一个函式里面完成新增 node 的动作
包括
List* new_node = malloc 新空间,赋值,等等
还有把 current->next = new_node 这样
可是这样似乎又没办法遵循‘一个函式只做一件事情’的好习惯
请问大家如此应该要怎办呢??
还是我的观念哪里有错误,
希望大家可以给我指导跟解惑,
谢谢。