go:关于变量地址的疑惑
定义一些变量,并输出其地址
一、一般变量
var a, b int32
var c, d int64
输出其地址
结果:
a 0xc082006310
b 0xc082006320
c 0xc082006330
d 0xc082006340
结论:
它们的地址间隔均为16字节,其它空余的地址浪费了?
二、数组切片
e := make([]byte, 40)
f := make([]byte, 40)
g := make([]byte, 40)
f = []byte("12345678901234567890") //字符串长度为20字节
g = []byte("1234567890123456789012345678901234567890") //字符串长度为40字节
1.输出各自len()与cap()
结果:
e: 40 40
f: 20 40
g: 40 40
结论:
a.切片的实际长度len()与其数据的长度相关,f[30]是不可访问的;
b.make([]byte,40)只保证其最大容量为40,即cap()=40。
2.输出首地址及其首个元素地址:
fmt.Printf("&e:%p &e[0]:%p ", &e, &e[0])
fmt.Printf("&f:%p &f[0]:%p ", &f, &f[0])
fmt.Printf("&g:%p &g[0]:%p ", &g, &g[0])
结果:
&e:0xc082008660 &e[0]:0xc08204c060
&f:0xc082008680 &f[0]:0xc0820086c0
&g:0xc0820086a0 &g[0]:0xc08204c0f0
结论:
a.顺序声明切片变量时,它们的地址是"连续"的,分别间隔32字节;
b.切片的数据地址与切片本身的地址无关
3.对于以下代码:
type test struct {
data []byte
}
func (t *test) set(buf []byte) {
t.data = buf
return
}
t.data=buf 意味着什么?
1)输出a和b的某些地址:
a := []byte("1234567890")
b := new(test)
b.set(a)
结果:
&a: 0xc082002660
&a[0]: 0xc082004310
&b: 0xc082028020
&b.data: 0xc082002680
&b.data[0]: 0xc082004310
2)输出a和b.data的len()和cap()
结果:
a: 10 16
b.data: 10 16
结论:
&a[0]==&b.data[0],且两者的数据和容量均相同,所以推测t.data=buf 意味着t.data和buf指向同一段数据
go:关于变量地址的疑惑的更多相关文章
- DEBUG模式下, 内存中的变量地址分析
测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...
- java中打印变量地址
在java中打印变量的地址 这个代码是在startoverflow上看到的,跟大家分享一下. import sun.misc.Unsafe; import java.lang.reflect.Fiel ...
- 驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead
PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其Act ...
- list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址
#define list_entry(ptr, type, member) \ ((type *)(() -> member))) 解释: 1 在0这个地址看做有一个虚拟的type类型的变量,那 ...
- [GO]变量内存和变量地址
package main import "fmt" func main() { //每个变量都有两层含义,变量的内存和变量的地址 fmt.Printf("a = %d\n ...
- C++打印变量地址
%p专门用来打印变量的以十六进制表示的地址: #include<iostream> using namespace std; int main() { ; printf("a的地 ...
- 打印变量地址-0x%08x
地址是8个16进制数. 1.8个16进制数:相当于32个二进制数.4G内存刚好可以用32位的二进制表示出来.2.因为变量或函数等等在运行时都是存储在内存中的,所以你用取地址符当然是取出计算机内存中的地 ...
- c++中变量、变量名、变量地址、指针、引用等含义
首先了解内存,内存就是一排房间,编号从0开始,0,1,2,3,4,5...... 房间里面一定要住人,新人住进去了,原来的人就走了:不管你住不住,里面都有人. 编号就是地址.里面的人就是内容,为了我们 ...
- Davinci-DM6467板子-外围器件的I2C地址的疑惑解答
这篇文即调试标清视频或者说调试TVP5147和ADV7343所使用的程序名称为video_sd_playback_480i_composite 我们用的是合众达公司(SEED)的SEED-DVSD64 ...
随机推荐
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- 解决java.net.MalformedURLException: unknown protocol: c问题
修改前代码: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builde ...
- PM成长之路(一)
到底什么样的人适合任项目经理一直是很多企业的困惑,因为大家发现优秀项目经理的特质看起来和传统的职能经理或技术专家很不一样.当企业在决定开展一个重大的项目时,如果不能找到一个适合带领和管理项目的项目经理 ...
- vi学习总结
1.模式 命令行模式:光标的移动.内容删除移动复制操作 插入模式:文字输入,即编辑状态 底行模式:文件保存或退出vi,设置编辑环境 2.基本操作 vi myfile,输入vi 文件名,,则进入vi. ...
- JavaScript中的类型转换
1.隐式类型转换 ①== 如果相等操作的两个变量不是同一类型,那么相等运算符会尝试进行一些类型转换: 如果一个是null,一个是undefined,则他们相等: 如果一个值是数字,另一个是字符串,先将 ...
- Downgrade PHP 7 to PHP 5.6 on Ubuntu 16.04
Downgrade PHP 7 to PHP 5.6 on Ubuntu ubuntu16.04 系统源自带是7.0的,如何降级安装PHP 5.6呢 .? apt-get install -y lan ...
- NodeJS 爬虫爬取LOL英雄联盟的英雄信息,批量下载英雄壁纸
工欲善其事,必先利其器,会用各种模块非常重要. 1.模块使用 (1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,OC的afnetworking) ...
- django models进行数据库增删查改
在cmd 上运行 python manage.py shell 引入models的定义 from app.models import myclass ##先打这一行 ------这些是 ...
- linux单网卡多IP配置
一.仅一个网卡的情况下,可以让该机器可以通过多个IP被访问,或隐藏常用IP,让他人访问其临时IP. 1.如果临时性的增加一个IP(重启机器或network服务后,丢失),可以使用ifconfig命令 ...
- SVN 提交报错:×××文件is not under version control
解决方法:1.删除出错的文件,然后在出错文件所在文件夹执行还原操作 2.VS中可将文件先排除在项目外,再包含在项目内,即可正常提交