bod*_*ydo 6 c memory return local
我跟朋友争吵了.他说我可以从函数返回指向本地数据的指针.这不是我所学到的,但我找不到反对他证明我的知识的反驳.
这是一个例子:
char *name() {
char n[10] = "bodacydo!";
return n;
}
Run Code Online (Sandbox Code Playgroud)
它用作:
int main() {
char *n = name();
printf("%s\n", n);
}
Run Code Online (Sandbox Code Playgroud)
他说这完全没问题,因为在一个程序调用name之后,它会返回一个指向n的指针,然后就会打印它.同时程序中没有其他任何事情发生,因为它是单线程的,执行是串行的.
我找不到反驳的论点.我永远不会写那样的代码,但他很顽固,并说这完全没问题.如果我是他的老板,我会解雇他是一个顽固的白痴,但我找不到反驳的论点.
另一个例子:
int *number() {
int n = 5;
return &n;
}
int main() {
int *a = number();
int b = 9;
int c = *a * b;
printf("%d\n", c);
}
Run Code Online (Sandbox Code Playgroud)
我得到一些好的答案后,我会把这个链接发给他,所以他至少学会了一些东西.
Ned*_*der 13
你的朋友错了.
name正在返回一个指向调用堆栈的指针.一旦调用printf,就无法知道在访问指针的数据之前如何覆盖该堆栈.它可能适用于他的编译器和机器,但它不适用于所有这些.
你的朋友声称在name返回后,"除了打印它之外没有任何反应". printf本身就是另一个函数调用,谁知道它内部有多少复杂性.在打印数据之前发生了很多事情.
此外,代码永远不会完成,它将被修改并添加到.代码"什么都不做"现在一旦发生变化就会做一些事情,而你的理所当然的伎俩将会崩溃.
返回指向本地数据的指针是一种灾难.
Pet*_*hle 10
当你在name()和printf()之间调用另一个函数时,你会遇到一个问题,它本身使用了堆栈
char *fun(char *what) {
char res[10];
strncpy(res, what, 9);
return res;
}
main() {
char *r1 = fun("bla");
char *r2 = fun("blubber");
printf("'%s' is bla and '%s' is blubber", r1, r2);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3710 次 |
| 最近记录: |