猿问
下载APP

通过指针从C和C ++中的函数返回本地数据

通过指针从C和C ++中的函数返回本地数据

我跟朋友争吵了。他说我可以从函数返回指向本地数据的指针。这不是我所学到的,但我找不到反对他证明我的知识的反驳。

这是一个例子:

char *name() {
    char n[10] = "bodacydo!";
    return n;}

它用作:

int main() {
    char *n = name();
    printf("%s\n", n);}

他说这完全没问题,因为在一个程序调用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);}

我得到一些好的答案后,我会把这个链接发给他,所以他至少学会了一些东西。


慕的地8271018
浏览 52回答 3
3回答

慕勒3428872

当你在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);}

海绵宝宝撒

你的朋友错了。name正在返回一个指向调用堆栈的指针。一旦调用printf,就无法知道在访问指针的数据之前如何覆盖该堆栈。它可能适用于他的编译器和机器,但它不适用于所有这些。你的朋友声称在name返回后,“除了打印它之外没有任何反应”。 printf本身就是另一个函数调用,谁知道它内部有多少复杂性。在打印数据之前发生了很多事情。此外,代码永远不会完成,它将被修改并添加到。代码“什么都不做”现在一旦发生变化就会做一些事情,而你的理所当然的伎俩将会崩溃。返回指向本地数据的指针是一种灾难。

当年话下

一旦函数的范围结束,即在函数的闭括号之后,将保留为所有局部变量分配(在堆栈上)的内存。因此,返回指向某个不再有效的内存的指针会调用未定义的行为。此外,您可以说当函数完成执行时,本地变量生命周期结束。您还可以在此处阅读更多详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答