标签: local-variables

可以在其范围之外访问局部变量的内存吗?

我有以下代码.

#include <iostream>

int * foo()
{
    int a = 5;
    return &a;
}

int main()
{
    int* p = foo();
    std::cout << *p;
    *p = 8;
    std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)

而代码只是运行而没有运行时异常!

输出是 58

怎么会这样?本地变量的内存不能在其功能之外无法访问吗?

c++ memory-management local-variables dangling-pointer

990
推荐指数
19
解决办法
26万
查看次数

在if语句中初始化变量的范围是什么?

我是Python的新手,所以这可能是一个简单的范围问题.Python文件(模块)中的以下代码让我感到困惑:

if __name__ == '__main__':
    x = 1

print x
Run Code Online (Sandbox Code Playgroud)

在我工作过的其他语言中,这段代码会引发异常,因为x变量是if语句的本地变量,不应该存在于它之外.但是这段代码执行并打印1.任何人都可以解释这种行为吗?模块中创建的所有变量是全局/可用于整个模块吗?

python variables scope if-statement local-variables

247
推荐指数
6
解决办法
10万
查看次数

为什么局部变量需要初始化,但字段不需要?

如果我在我的类中创建一个bool,就像它一样bool check,它默认为false.

当我在我的方法中创建相同的bool时bool check(而不是在类中),我得到一个错误"使用未分配的局部变量检查".为什么?

c# language-design local-variables

139
推荐指数
4
解决办法
2万
查看次数

如何从Delphi程序或编译器生成的调试信息中提取局部变量信息(地址和类型)?

我的目标是:

  • 给定Delphi编译的32位或64位Windows程序中的挂起线程,以便遍历堆栈(可行)
  • 给定堆栈条目,枚举每个方法中的局部变量及其值.也就是说,至少找到它们的地址和类型(integer32/64/signed/unsigned,string,float,record,class ...),其组合可用于查找它们的值.

第一个很好,这是这个问题的第二个问题.在高级别,如何在Delphi中给出堆栈条目枚举局部变量?


在较低的水平,这是我一直在调查:

RTTI:没有列出有关方法的这类信息.这不是我实际上认为是一个现实的选择,但无论如何列在这里.

调试信息:加载为调试版本生成的调试信息.

  • 映射文件:即使是详细的映射文件(文本格式文件!打开并查看)也不包含本地变量信息.它基本上是地址列表和源文件行号.非常适合文件和行相关的地址,例如装订线中的蓝点; 不是更好的更详细的信息
  • 远程调试信息(RSM文件) - 没有关于其内容或格式的已知信息.
  • TD32/TDS文件:我目前的研究方向.它们包含许多其他信息中的全局和局部符号.

我遇到的问题是:

  • 没有TD32文件格式的文档(我可以找到.)
  • 我对它们的大部分知识来自使用它们的Jedi JCL代码(JclTD32.pas),我不确定如何使用该代码,或者那里的结构是否足以显示本地变量.我很确定它会处理全局符号,但我对本地问题非常不确定.定义了各种各样的常量,没有格式的文档,读取它们的含义,我只是猜测.但是,这些常量和它们的名称必须来自某个地方.
  • 我可以找到使用TDS信息的源不加载或处理本地符号.

如果这是正确的方法,那么这个问题变成'是否有TDS/TD32文件格式的文档,是否有任何加载局部变量的代码示例?'

代码示例不是必需的,但可能非常有用,即使它非常小.

delphi stack local-variables debug-symbols

105
推荐指数
1
解决办法
1616
查看次数

C语言中字符串文字的"生命周期"

以下函数返回的指针不会无法访问吗?

char *foo( int rc ) 
{
    switch (rc) 
    {
      case 1:           return("one");
      case 2:           return("two");
      default:           return("whatever");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以C/C++中局部变量的生命周期实际上只在函数内,对吧?这意味着,在char* foo(int)终止后,它返回的指针不再意味着什么?

我对本地var的生命周期有点困惑.谁能给我一个很好的澄清?

c function local-variables lifetime string-literals

79
推荐指数
5
解决办法
2万
查看次数

在ArrayBlockingQueue中,为什么要将最终成员字段复制到本地最终变量中?

ArrayBlockingQueue,所有需要锁的方法final在调用之前将其复制到局部变量lock().

public boolean offer(E e) {
    if (e == null) throw new NullPointerException();
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        if (count == items.length)
            return false;
        else {
            insert(e);
            return true;
        }
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

当字段是什么时,有没有理由复制this.lock到局部变量?lockthis.lockfinal

此外,它还在使用E[]之前使用本地副本:

private E extract() {
    final E[] items = this.items;
    E x = items[takeIndex];
    items[takeIndex] = null;
    takeIndex = inc(takeIndex);
    --count;
    notFull.signal();
    return x;
}
Run Code Online (Sandbox Code Playgroud)

有没有理由将最终字段复制到本地最终变量?

java optimization multithreading final local-variables

78
推荐指数
2
解决办法
2803
查看次数

为什么我们不能使用未初始化的局部变量从该变量的类型访问静态内容?

尝试x通过未初始化的局部变量访问静态字段时,出现Foo foo; foo.x编译错误Variable 'foo' might not have been initialized

class Foo{
    public static int x = 1;

    public static void main(String[] args) {
        Foo foo;
        System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized
    }
}
Run Code Online (Sandbox Code Playgroud)

它可能看起来像这样的错误是有道理的,但直到我们意识到,访问static成员编译器不实际使用的变量,但只有它的类型

例如,我可以foo使用value 进行初始化,null这将使我们能够x毫无问题地进行访问:

Foo foo = null;
System.out.println(foo.x); //compiles and while running prints 1!!! 
Run Code Online (Sandbox Code Playgroud)

之所以如此,x是因为编译器意识到这是静态的,并foo.x像对待其编写时一样对待Foo.x(至少这是我到目前为止所认为的)。 …

java static initialization local-variables jls

76
推荐指数
3
解决办法
3822
查看次数

Java中的默认值和初始化

根据我的参考,基本类型具有默认值,对象为空.我测试了一段代码.

public class Main {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

该行将System.out.println(a);是指向变量的错误a,variable a might not have been initialized而在给定的引用中,该变量integer将具有0默认值.但是,使用下面给出的代码,它实际上会打印出来0.

public class Main {
    static int a;
    public static void main(String[] args) {
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个代码可能出现什么问题?类实例变量的行为是否与局部变量不同?

java initialization global-variables local-variables default-value

71
推荐指数
4
解决办法
13万
查看次数

C++局部变量销毁顺序

是否存在在C++(11)中解除分配局部变量的已定义顺序?更简洁:在同一范围内两个局部变量的析构函数的副作用会以何种顺序变为可见?

例如:

struct X{
  ~X(){/*do something*/}
}

int main(){
   X x1;
   X x2;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

x1x2毁坏第一主时返回或在C++ 11未定义的顺序?

c++ destructor local-variables c++11

51
推荐指数
3
解决办法
2万
查看次数

如何使用指针从不同的函数访问局部变量?

我可以在不同的函数中访问局部变量吗?如果是这样,怎么样?

void replaceNumberAndPrint(int array[3]) {
    printf("%i\n", array[1]);
    printf("%i\n", array[1]);
}

int * getArray() {
    int myArray[3] = {4, 65, 23};
    return myArray;
}

int main() {
    replaceNumberAndPrint(getArray());
}
Run Code Online (Sandbox Code Playgroud)

上面一段代码的输出:

65
4202656
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?"4202656"是什么意思?

我是否必须在replaceNumberAndPrint()函数中复制整个数组才能比第一次更多地访问它?

c c++ pointers local-variables

50
推荐指数
3
解决办法
3万
查看次数