C和C++ 变量内存

当我们在C或C++ 代码中定义了一个 int /long 类型的变量时,计算机会在内存中分配一段连续的内存来保存变量的值。(int 占用的内存大小和编译器位数有关,16位占用2个字节,32位占用4个字节, long 在32位编译器占用4个字节,64位编译器占用8个字节)。

#include <stdio.h>
int main()
{

    int i = 1;
    int j = -2;
    long l = 3, m = 4;
    printf("Hello world sizeof(i)=%d, sizeof(j)=%d, sizeof(l)=%d, sizeof(m)=%d!\n", sizeof(i), sizeof(j), sizeof(l), sizeof(m));

}

以上为我们在 hello world 基础上添加了一段扩展代码,用来打印变量占用字节。

我安装的 redhat 是64位,编译32位程序时使用

g++ -m32 test.cc -o test32 -g

输出结果

[**********]$ ./test
Hello world sizeof(i)=4, sizeof(j)=4, sizeof(l)=8, sizeof(m)=8!

默认编译位64位程序。(如果linux是32位, -m64 生产64位程序)

g++ test.cc -o test -g

输出结果

[**********]$ ./test32
Hello world sizeof(i)=4, sizeof(j)=4, sizeof(l)=4, sizeof(m)=4!

-g是为了生产调试信息, 如果使用 gdb 调试程序,输入 gdb test

在第7行加入断点,运行到这里时会暂停。这时我们可以查看变量,内存等

i和j, l 和 m 的地址之间距离分别为 int 和 long 的字节数。

我们想查看变量在内存中保存的二进制值可以在 gdb 中使用 x/t &i 来达到目的

因为 j 是负数,保存样式和别的值区别大一些。(涉及反码,补码等内容会在后续说明)

在代码中定义的变量在 main 函数的函数体中,这种变量是保存在stack 中的,我们能看到在 stack 中的内存是从高位开始分配,如果是在 heap 上分配内存会从低位开始往高位分配,关于内存这方面的内容也会在后续文档中详细介绍。

以上示例是为了告诉大家,当我们定义了一个变量时,会在内存中开辟一段内存用于保存变量内容,开辟多少内存由变量类型来决定。

计算机在访问这块儿内存的时候,会根据内存地址找到初始位置,需要读取多长内存也是由变量类型来决定。

计算机只能识别0或者1,假定,从我们需要的内存地址开始,有一段内存的二进制数据为如下代码时

0000100110011100000000000100100...........

计算机怎么来确定真正需要的值是多少呢?这就是前边说的由变量类型来决定,变量类型说我需要2个字节,就会读取两个字节长度的内容,然后根据变量类型的正负来确定是原码还是补码来表示。接下来就是我们对这段内存变量做处理了,比如我们需要和另一个变量做加法,或者直接打印出来等等。

原文地址:https://www.cnblogs.com/kylinhu/p/11096414.html

时间: 2024-08-12 23:12:33

C和C++ 变量内存的相关文章

C++变量内存分配及类型修饰符

前言 了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期.另外,变量类型修饰符也会影响到变量的初始化值及其生存周期.掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变量时更准确. 内存分配 1.     C++程序的内存布局 现代电脑都是遵循冯诺依曼体系结构,所以C++程序的内存布局也是遵循该体系的.主要包括5个部分,即代码段.数据段.BSS段.堆和栈.. 1.     代码段 代码段(code segment/text segment),通常是指用来存放程序执

案例描述:不同类型变量顺序保存时,变量强制转换对变量内存的影响。

大家都知道c语言变量的存储是从小到大增加. address c :FF39 address n :FF3A 并没有改变c和n的地址. address c :FF39 address n :FF3A 但是c的值被改变了, c的值变成了-127. 上述实验表明了变量的强制转换并不会对变量的存放地址产生影响,只会对变量的值产生影响.案例描述:不同类型变量顺序保存时,变量强制转换对变量内存的影响.

黑马程序员——C语言变量内存分析与scanf函数

Java培训.Android培训.iOS培训..Net培训.期待与您交流! 1.变量的内存分析 1)变量以字节为单位,每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间就相当于是每个字节,地址就是房号,根据房号可以找到房间(根据地址也可以找到内存中的字节).相邻房间的房号是连续的,相邻字节的地址也是连续的.计算机中通常以十六进制表示地址.变量所占用字节数跟类型有关,也跟编译器环境有关 2)内存由大到小寻址,优先分配内存地址较大的字节

c++中函数中变量内存分配以及返回指针、引用类型的思考

众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函数中我们自己声明的局部变量. 这样,程序在某些情况下就可能存在一定的问题.看似很简单的问题,通过仔细的分析,我们就能够更好的理解c++中内存分配和释放的问题. 好,废话不多说,我们进入正题.首先,简单介绍一下程序的内存区域的分配: 程序的内存分配 ①堆区(heap).这一部分主要是由程序开发人员自己

php变量内存完全释放

<?php echo memory_get_usage().PHP_EOL;$a = 1;$b = $a;$a = null;$b = null;unset($a);unset($b);echo memory_get_usage().PHP_EOL; php中变量名的内存与变量值得内存是不关联.

python变量内存浅析

1. Python变量 如果把单一值变量称为一维变量,把可以扩展元素的变量称为多维变量,则python的变量可以划分如下: 变量维度 Python变量 说明 一维 数字 int(有符号整型) 数字类型可以做转换 long(长整型[也可以代表八进制和十六进制]) float(浮点型) complex(复数) 字符串 字符串有丰富的运算符和内嵌函数: 有格式化输出: 二维 列表 除了元祖外,列表和字典可以灵活的扩展元素 元组 字典 2. Python变量的赋值处理 这里主要分析情况为,将原始变量赋值

变量-内存-作用域(JavaScript)

基本类型和引用类型 ECMAScript变量可能包含两种不同数据类型的值:基本数据类型值和引用类型值. 基本数据类型为:Undefined,Null,Boolean,Number和String五种. 引用类型为:Object,Array,Date,RegExp,Function. 基本变量值复制 var a = 11; var b = a; console.log(b);//11 a = 22; console.log(a);//22 console.log(b);//11 //b still

8.变量内存CPU原理

编译器先明确是什么类型,然后明确变量名,变量表管理所有的变量,不在变量表内部的变量不能引用.每个变量对应一整块内存 a+1所计算出来的值在寄存器中,只有变量可以被赋值,变量必须在内存里面 c语言内嵌汇编 1 void main() 2 { 3 int a; 4 printf("%p", &a); 5 6 //a = 10; 7 _asm 8 { 9 mov eax,10 10 11 mov a,eax 12 } 13 14 printf("\na=%d",

变量及变量内存管理

1.变量的定义,什么是变量? 量:衡量/记录现实世界中的状态,让计算机能够像人一样去识别世间万物.(很抽象,可以简单理解为一种状态) 变:现实世界中的状态是会发生改变的. 2.为什么要有变量?因为程序执行的本质就是一系列状态的变化.比如MOBA类游戏,游戏运行时会有经济,人数的变化.这些变化的量就是变量. 3.定义变量分为三部分:①·变量值 我们存放的数据,用于记录现实生活中状态.②·赋值符号 赋值.③·变量名 用来引用变量值,但凡调用变量值,就要通过变量名. 4.变量名的命名规范大前提:变量名

[GO]变量内存和变量地址

package main import "fmt" func main() { var a int = 10 //每个变量都有两层含义,变量的内存和变量的地址 fmt.Printf("a = %d\n", a) //变量的内存 10 fmt.Printf("a = %v\n", &a) //变量的地址 0xc042060080 //保存某个变量的地址,需要指针类型, *int保存int的地址, **int保存*int的地址 //声明(定义