[问题] 有关于 return local variable

楼主: gowrite (gowrite)   2017-12-16 01:05:03
开发平台(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 这样
可是这样似乎又没办法遵循‘一个函式只做一件事情’的好习惯
请问大家如此应该要怎办呢??
还是我的观念哪里有错误,
希望大家可以给我指导跟解惑,
谢谢。
作者: moebear (萌熊)   2017-12-16 01:23:00
可以改成把指标传进去给他
作者: LPH66 (-6.2598534e+18f)   2017-12-16 01:55:00
不好的事情应该是“回传指向区域变量的指标”如果只是回传一个区域变量的值那什么事都没有因为这种事我们天天都在做
作者: moebear (萌熊)   2017-12-16 02:00:00
是这个意思而且你写法应该没问题,他回传的是head里指标的值
作者: stupid0319 (征女友)   2017-12-16 02:21:00
原PO还没弄懂指标真正的含义
作者: b0920075 (Void)   2017-12-16 02:56:00
你的current是指向heap的指标,ok的
作者: CoNsTaR ((const *))   2017-12-16 03:02:00
clang 的 extension 有 closure 可以用虽然说实际上不会去用它啦…
作者: peterwu4 (notd)   2017-12-16 16:10:00
你讲的区域变量是一个指标(先不理它特殊的身份),回传就是复制一份新的,像你的例子是把current最后的内容回传last_node,然后last_node里面的内容就指著最后一个node面 last_node->next = new_node;的内存位置,然后你new的node就接在原来last_node的后怎么推文也可以乱掉XD我猜你可能是和c++讲的reference观念混到了,如果是回传指定的内容是ref,回传local variable就会出问题
作者: LPH66 (-6.2598534e+18f)   2017-12-16 18:04:00
我是认为原 PO 把“回传指向区域变量的指标”跟“回传一个本身是指标的区域变量”搞混了后者只要该指标不是前者的状况那什么事都没有就单纯只是回传一个区域变量的值而已, 只是恰巧该值是指标
作者: Killercat (杀人猫™)   2016-01-02 22:44:00
问一个例子 你有个函数是把a+b回传 你不回local怎么做?不要太钻牛角尖 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com