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

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)

  • Peter:如果你没有编译器,可以试试http://ideone.com这样的在线版本(它会给你预期的结果). (2认同)