我有以下代码.
#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
怎么会这样?本地变量的内存不能在其功能之外无法访问吗?
我是Python的新手,所以这可能是一个简单的范围问题.Python文件(模块)中的以下代码让我感到困惑:
if __name__ == '__main__':
x = 1
print x
Run Code Online (Sandbox Code Playgroud)
在我工作过的其他语言中,这段代码会引发异常,因为x变量是if语句的本地变量,不应该存在于它之外.但是这段代码执行并打印1.任何人都可以解释这种行为吗?模块中创建的所有变量是全局/可用于整个模块吗?
如果我在我的类中创建一个bool,就像它一样bool check,它默认为false.
当我在我的方法中创建相同的bool时bool check(而不是在类中),我得到一个错误"使用未分配的局部变量检查".为什么?
我的目标是:
第一个很好,这是这个问题的第二个问题.在高级别,如何在Delphi中给出堆栈条目枚举局部变量?
在较低的水平,这是我一直在调查:
RTTI:没有列出有关方法的这类信息.这不是我实际上认为是一个现实的选择,但无论如何列在这里.
调试信息:加载为调试版本生成的调试信息.
我遇到的问题是:
如果这是正确的方法,那么这个问题变成'是否有TDS/TD32文件格式的文档,是否有任何加载局部变量的代码示例?'
代码示例不是必需的,但可能非常有用,即使它非常小.
以下函数返回的指针不会无法访问吗?
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的生命周期有点困惑.谁能给我一个很好的澄清?
在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)
有没有理由将最终字段复制到本地最终变量?
尝试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(至少这是我到目前为止所认为的)。 …
根据我的参考,基本类型具有默认值,对象为空.我测试了一段代码.
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
是否存在在C++(11)中解除分配局部变量的已定义顺序?更简洁:在同一范围内两个局部变量的析构函数的副作用会以何种顺序变为可见?
例如:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是x1或x2毁坏第一主时返回或在C++ 11未定义的顺序?
我可以在不同的函数中访问局部变量吗?如果是这样,怎么样?
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()函数中复制整个数组才能比第一次更多地访问它?
local-variables ×10
c++ ×3
java ×3
c ×2
c# ×1
c++11 ×1
delphi ×1
destructor ×1
final ×1
function ×1
if-statement ×1
jls ×1
lifetime ×1
optimization ×1
pointers ×1
python ×1
scope ×1
stack ×1
static ×1
variables ×1