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

标签 c memory return local

我和 friend 吵架了。他说我可以从一个函数返回一个指向本地数据的指针。这不是我学到的,但我找不到他的反驳来证明我的知识。

以下是图解案例:

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);
}

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

最佳答案

你的 friend 错了。

name 正在返回一个指向调用堆栈的指针。一旦你调用了printf,在指针处的数据被访问之前,不知道该堆栈将如何被覆盖。它可能适用于他的编译器和机器,但不会适用于所有这些。

你的 friend 声称在 name 返回后,“除了打印它什么都没有发生”。 printf 本身就是另一个函数调用,谁知道它的复杂程度。在打印数据之前发生了很多事情。

此外,代码永远不会完成,它会被修改和添加。现在,“什么都不做”的代码一旦更改就会有所作为,而您的合理技巧将会崩溃。

返回指向本地数据的指针是灾难的根源。

关于c - 通过指针从 C 和 C++ 中的函数返回本地数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127507/

相关文章:

memory - OpenCL 内存架构和 GPU 物理内存/缓存(L1/L2...)之间的关系?

PHP open_basedir - 返回值?

c - sizeof 复合文字数组

计算一个数在数组中出现的次数

c - SIGSEGV - 运行时错误

c - lseek() 的返回值

c++ - 当所有值都是非负数时,我们真的可以避免额外的空间吗?

c++ - VS调试时查找类成员的地址

c# - 如何有效地计算对数返回

C: 函数可以返回一个全局变量吗?