`
waret
  • 浏览: 136757 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

g++对函数局部变量的定义

阅读更多

编写如下程序:

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	char b = 'a';
	int c = 20;
	printf("&a = 0x%08x \n", &a);
	printf("&b = 0x%08x \n", &b);
	printf("&c = 0x%08x \n", &c);
	cout << endl;

	char b1 = 'a';
	int a1 = 10;
	int c1 = 20;
	printf("&a1 = 0x%08x \n", &a1);
	printf("&b1 = 0x%08x \n", &b1);
	printf("&c1 = 0x%08x \n", &c1);
	cout << endl;

	struct
	{
		int a;
		char b;
		int c;
	} st;
	st.a = 10;
	st.b = 'a';
	st.c = 20;
	printf("&st = 0x%08x \n", &st);
	printf("&st.a = 0x%08x \n", &st.a);
	printf("&st.b = 0x%08x \n", &st.b);
	printf("&st.c = 0x%08x \n", &st.c);

	return 0;
}

 结果如下所示:

&a = 0xbf94c368 
&b = 0xbf94c36f 
&c = 0xbf94c364 

&a1 = 0xbf94c360 
&b1 = 0xbf94c36e 
&c1 = 0xbf94c35c 

&st = 0xbf94c350 
&st.a = 0xbf94c350 
&st.b = 0xbf94c354 
&st.c = 0xbf94c358 

 结果分析:

    在C++中,函数局部变量所占用的空间是在栈中的,而栈空间是随着压入变量的增多,自高地址向低地址生长。按照变量声明的顺序,压栈的顺序应该是(a, b, c, b1, a1, c1, c),而实际上为了保证内存中的数据对齐,压栈的顺序变成了(b, b1, a, c, a1, c1, c)。

 

    另外是关于大端与小端的问题。x86的CPU都是采用的小端存储方法。

    大端模式(big-edian),big-endian:MSB存放在最低端的地址上。举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:

| data |<-- address
| 0x12 |<-- 0x00002000
| 0x34 |<-- 0x00002001

    在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15 |
------MSB----------------------------------LSB
val | 1 0 0 0 1 0 1 1 | 1 0  0  0  1  0  1  0 |
+--------------------------------------------+
= 0x 8 B 8 A

    小端模式(little-endian),little-endian:LSB存放在最低端的地址上。举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:

| data |<-- address
| 0x34 |<-- 0x00002000
| 0x12 |<-- 0x00002001

    在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
------MSB-----------------------------------LSB
val | 1  0  0  0  1  0  1 1 | 1 0 0 0 1 0 1 0 |
+---------------------------------------------+
=0x 8 B 8 A

    假设有一个int类型的变量0x12345678,其地址是0xbfa42030,如果是小端存储,那么高字节在高位,低字节在低位,也就是说,0xbfa42030所对应的字节为0x78,0xbfa42031所对应的字节为0x56,0xbfa42030所对应的字节为0x34,0xbfa42030所对应的字节为0x12。同时,每个bit位的顺序也是低bit在低位,高bit在高位。

 

    判断机器是大端机还是小端机的代码:

#include<stdio.h>
int main(int argc, char * argv[])
{
    int a=1;
    char *p=(char *)&a;
    if(1==*p)
        printf("intel\n");
    else
        printf("moto\n");
    return 0;
}
 
分享到:
评论

相关推荐

    c++通过结构体(struct)全局变量在多线程中传递参数

    全局变量是在函数外部定义的变量,可以在程序的任何地方被访问,只要该文件被包含或链接。然而,在多线程环境中,全局变量可能会引发竞态条件,即多个线程同时读写同一变量,导致不可预测的结果。为了解决这个问题,...

    C++试题and答案

    - `this`指针的主要用途是作为成员函数内部的标识符,用于区分成员变量和局部变量等。 ### 多态性 - **多态性**是指同一接口(通常是函数或方法)在不同的情况下表现出不同的行为。 - C++中的多态性主要通过虚函数...

    西北农林科技大学C++试题及答案

    - 作为成员函数内的标识符,用来区分成员变量与局部变量。 - 在成员函数内部引用对象的成员。 ### 多态性 - **定义**: 多态性是指程序中能够根据不同的对象自动调用相应的成员函数的能力。 - **实现方式**: - ...

    C++-Primer阅读笔记

    6. **未初始化的变量**:在函数体外部定义的变量默认初始化为0,而在函数内部定义的变量不自动初始化,可能会得到随机值。因此,推荐始终初始化变量。 7. **声明与定义**:声明告诉编译器变量的类型和名称,而定义...

    C++学习笔记

    8. **变量作用域和优先级**:局部变量优先于全局变量,如果在小范围内(如函数内)定义了同名变量,那么在该范围内使用时会优先使用局部变量。未明确指定作用域时,编译器会从局部到全局搜索变量定义。 9. **字符串...

    递归调用的子程序示例gdb调试用

    这种调用可以是直接的,也可以是间接的,但关键在于每次调用都会创建一个新的函数实例,拥有独立的局部变量和参数。递归通常包括两个基本部分:基本情况(base case)和递归情况(recursive case)。基本情况是问题...

    自学C++教程-入门到精通的初步者

    变量是存储数据的容器,有不同类型的变量,包括局部变量(仅在函数内部有效)和全局变量(在整个程序中有效)。变量的声明和定义有区分,左值(Lvalues)指的是可以赋值的表达式,而右值(Rvalues)则表示一个结果值...

    linux-GDB-tutorial.zip_GDB手册_Linux Gdb调试_gdb_gdb教程

    同时,`up`和`down`命令允许你在调用堆栈中移动,查看不同层级的局部变量。 变量的查看和修改是调试过程中的关键步骤。`print`或`p`命令用于打印变量的值,`set variable`则可以改变变量的值。此外,`display`命令...

    GNU-make指南

    如果需要在多个源文件之间共享数据,可以通过传递函数参数或使用静态局部变量的方式实现。 3. **正确处理外部声明**:对于需要在多个源文件中使用的变量或函数,应当使用`extern`关键字进行声明,这样可以确保不...

    Linux C语言手册.rar

    - 错误检测:使用errno全局变量和perror()函数报告系统错误。 - 异常处理:setjmp()和longjmp()实现非局部跳转,处理异常情况。 8. **Linux系统调用** - 在Linux环境中,C语言可以通过系统调用来访问操作系统...

    c++运行程序缺少mex.h

    - **类型定义**:该文件还定义了一些类型,如`mexFunctionTableEntry`、`mexGlobalTableEntry`等,这些类型对于管理全局变量和函数表至关重要。 ##### 2. **结构分析** - **基本类型定义**: ```cpp typedef ...

    C语言重要知识点梳理

    2. **栈区**:用于存放函数调用时的局部变量、函数参数以及返回地址等信息。默认情况下,每个字节初始化为`cc`。 3. **堆区**:用于动态分配的内存,由程序员手动管理。默认情况下,每个字节初始化为`cd`。 4. **...

    跟我一起写makefile

    我们可以定义全局变量和局部变量,使用`=`进行赋值。例如: ```makefile CC = g++ CFLAGS = -Wall -g ``` 这里,`CC`变量被设置为C++编译器`g++`,而`CFLAGS`包含了编译时的警告标志`-Wall`和调试信息`-g`。 ...

    GDB如何调试程序

    - `info locals` 显示当前作用域的局部变量。 - `print variable_name` 输出变量的值。 ### 7. 单步执行与跳过 - `step` (s) 逐步执行,如果当前行有函数调用,会进入该函数。 - `next` (n) 逐步执行,但遇到函数...

    c++多个源文件Sales_item.cpp

    如果`Sales_item.hpp`中定义了类或者函数,`g++`会自动查找并包含这个头文件,这是因为`#include`指令的作用。 C++中的命名空间(namespace)是管理全局标识符的有效方式,防止不同库之间的名称冲突。例如,`std::...

    linux从入门到精通

    3. 函数和变量:定义函数,理解局部变量和全局变量。 六、Linux系统管理 1. 进程管理:了解进程状态,使用ps、top、kill命令管理进程。 2. 目录与文件权限:理解rwx权限位,使用chmod、chown、chgrp命令改变权限和...

    达内项目经理整理的c++复习资料

    通常用于存储局部变量和函数调用过程中的临时数据。 - **堆 (Heap)**:一种动态分配的内存区域,由程序员手动管理。主要用于动态分配对象和数组等。 - **应用场景**:理解栈和堆的区别对于有效地管理内存至关重要。...

    C/C++语言初学者FAQ

    - **栈内存**:自动分配和释放,存储局部变量。 - **堆内存**:动态分配,使用`malloc`/`calloc`分配,`free`释放。 6. **错误与调试** - **运行时错误**:如除以零、数组越界等,可能导致程序崩溃。 - **编译...

Global site tag (gtag.js) - Google Analytics