变量声明有没有分配内存?

Q1:

int i 这个有没有分配内存呢?

int *p 呢?

具体是在栈空间还是在堆空间里分配内存呢?

?

A1:

int i;

int *p;

这两个都在栈区分配了内存空间

但是p指向的地址为野地址,不可直接拿来使用

即p指向的空间没有分配

?

Q2:在Java中定义数组时必须分配内存,这句话是错的还是对的呢

?

A2:

Java中的数组你可以看到一个特殊的对象,声明时是放在栈中的,分配的空间存储在堆中

如:

1. int[] arr = null;

此时只是在栈中声明了一个 arr 数组,但并未对其分配空间,所以它没有指向

2. int[] arr = new int[6];

此时在栈中声明了一个arr数组,并且在堆中开辟了一块空间,此时 arr 已经分配内存了

看具体的情况吧,定义数组应该是声明吧,在需要的时候再开辟空间也可以

?

Q3:

Java 中没有初始化的局部变量分配了内存吗?

声明2个局部变量

int i;

int j = 0;

请问这两种情况都在栈内分配了内存吗?

如果是声明3个引用变量,请问它们有什么区别呢?

Object o;

Object b = null;

Object j = new Object();

第一种是不是只在栈内分配了内存,而没有在堆内分配内存,或者是堆和栈都没有分配内存;

第二种只在栈内分配内存吗?还是堆和栈都分配了内存,null占用内存吗?占用的是堆还是栈内存?

?

A3:

先贴上代码和编译生成的指令再分析

public static void main(String[] args) {

String s;

int i;

}

———-生成的指令———–

public static void main(java.lang.String[]);

Code:

0: return

}

——-代码———

public static void main(String[] args) {

String s=new String(“”);

int i=0;

}

—–生成的指令———-

public static void main(java.lang.String[]);

Code:

0: new #16; //class java/lang/String

3: dup

4: ldc #18; //String

6: invokespecial #20; //Method java/lang/String.””:(Ljava/lang/Str

ng;)V

9: astore_1

10: iconst_0

11: istore_2

12: return

}

从上面可以看出,虽然两个变量都没有使用,但编译器还是没把它们处理掉,并为之分配了空间,如果没有初始化的变量将会被编译器忽略掉。

最后补充一点,上面李守宇 说的变量不使用就会被编译器忽略掉,我个人觉得不会这样,因为new一个对象出来,就是对这个类的主动使用,会触发类的一些静态块和静态变量的初始化,所以就算不被使用也会被编译,加载jdbc驱动就是一个例子。

局部变量没有初始化编译的时候不会通过,如果初始化后应该被放在栈里。

o和b一样,都是只有在栈里分配内存,在堆里没有内存,只有new过之后,才在堆里分配内存。

时间: 2024-10-05 23:51:55

变量声明有没有分配内存?的相关文章

C语言变量声明内存分配

转载: C语言变量声明内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放. 2.堆区(heap) — 在内存开辟另一块存储区域.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)—编译器编译时即分配内存.全局变量和静态变量

内存四域,变量声明和定义,寄存器,c内嵌汇编,auto,堆栈,常量,静态变量

 1.内存四大区域 2.在程序中,变量的声明可以有多份,定义只能有一份 3.寄存器在cpu里面,没有地址 4.c语言内嵌汇编语言 5.auto变量 自动分配内存,自动释放内存. 6.栈的大小由编译器决定 修改栈的方式,右击项目à属性à配置属性à链接器à系统à堆栈保留大小 7.卡死cpu,卡死内存的程序 8.在堆上申请空间后赋值后,不可以释放内容.要通过free方法进行释放对空间. 9.常量字符串在代码区.代码区是智能读的. 10.常量本质 10.静态变量,全局变量的差别 A全局变量可以跨文件

关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存

#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //声明字符型数组和指针变量 char str[10]; char *strip=str; //输入输出 cout<<"str="; cin>>str; //用字符数组输入字符串 cout<<"str="<<

php内核为变量的值分配内存的几个宏

在php5.3之前,为某变量分配内存是用宏 MAKE_STD_ZVAL; 737 #define MAKE_STD_ZVAL(zv) \ # /Zend/zend.h738 ALLOC_ZVAL(zv); \739 INIT_PZVAL(zv); 165 #define ALLOC_ZVAL(z) \ # /Zend/zend_alloc.h166 (z) = (zval *) emalloc(sizeof(zval)) 727 #define INIT_PZVAL(z) \          

内存在静态变量区分配内存

内存:1:堆存储区 ==> 存储手动分配的内存:malloc free 2:栈存储区 ==> 系统为临时变量分配内存的区域 3:静态变量存储区 ==> 用来存储静态变量内存 当程序启动时,先为所有的静态变量分配内存 在程序执行中,static静态变量的内存一直保留 当程序完全结束时,系统才释放所有的static变量

C++ 内存、new与malloc分配内存区别?

一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或de

分配内存malloc和free()

所有的程序都必须留出足够的内存来存储它们使用的数据.一些内存分配是自动完成的.在运行时需要分配更多的内存.主要的工具是函数malloc(),它接受一个参数:所需要内存字节数.然后malloc找到可用内存中一个大小合适的块.内存是匿名的:也就是说,malloc()分配了内存,但没有为它指定名字.然而,它却可以返回那块内存第一个字节的地址.因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存. char place[] = "Dancing Oxen Creek"; 因为ch

了解VBA的变量声明及赋值

1.几种不同的声明:公共变量:Public 变量名 As 数据类型 私有变量:Private 变量名 As 数据类型 静态变量:Static 变量名 As 数据类型 Dim的声明是最常见的声明,包括以上三种,都是针对变量不同的作用域来选择如何声明的,和咱们学的编程语言一样一样的,全局变量和局部变量. 2.接下来说作用域:比如我们的C语言中,全局变量是在整个程序中都可以使用,一般一直拥有内存,而局部变量一般定义在函数里,只能在函数中使用,函数开始就分配内存空间,函数结束就释放内存空间. VBA中,

分配内存(Linux设备驱动程序)

分配内存 介绍设备驱动程序中使用内存的方法: 如何最好地利用系统内存资源. kmalloc函数 kmalloc内存分配引擎是一个功能强大的工具. #include <linux/slab.h> void *kmalloc(size_t size, int flags); 参数分配表示flags能够以多种方式控制kmalloc的行为. 标志GFP_KERNEL表示内存分配是代表运行在内核空间的进程执行的,这意味着调用它的函数正代表 某个进程执行系统调用. 使用GFP_KERNEL允许kmallo