【问题标题】:Variable passes out of scope and memory keeps values [duplicate]变量超出范围,内存保持值[重复]
【发布时间】:2015-04-21 01:04:24
【问题描述】:

我正在学习 C 编程并使用 Geany 在 Ubuntu 中进行一些测试。我有一个关于指针的问题。当一个数组在函数中声明然后作为指针返回时,数组值会在 main 方法中丢失。我可以用一个简单的例子来检查:

#include <stdio.h>

char* msg ();

int main(int argc, char **argv)
{
    char* p = msg();
    int i;
    for(i=0;i<=10;i++)
        printf("i: %d, value: %c \n", i, p[i]);
    return 0;
}

char* msg (){
    char msg [] = "hello";
    return msg; 
}

输出是随机值(第一个总是'h'的除外)。我想这是因为指针超出了作用域,内存可以被其他函数写入。

但如果 message 的值足够大(例如数千个字符或更少),则值位于相同的内存位置,尽管数组是在其他函数中创建的,但我可以读取它们。

这个结果的原因是什么?

非常感谢。

【问题讨论】:

  • 你怎么知道'h'不是随机的?
  • 请给我一个很好的理由,你为什么要尝试这个?同一程序中的许多错误。即使您执行printf("%c\n", p[0]);,您也会调用未定义的行为。
  • 我认为'h'不是随机的,因为在执行程序十次之后......
  • 我正在做这种测试,以了解堆栈是如何处理的以及内存中保存了哪些值。我知道这是一个错误的实现,但我正在寻找合乎逻辑的答案。

标签: c arrays pointers memory stack


【解决方案1】:

返回指向 automatic 局部变量的指针会调用未定义的行为。

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2021-10-04
    • 1970-01-01
    • 2013-02-20
    • 2016-04-30
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多