定义一些变量,并输出其地址

一、一般变量

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:关于变量地址的疑惑的更多相关文章

  1. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  2. java中打印变量地址

    在java中打印变量的地址 这个代码是在startoverflow上看到的,跟大家分享一下. import sun.misc.Unsafe; import java.lang.reflect.Fiel ...

  3. 驱动中获取PsActiveProcessHead变量地址的五种方法也可以获取KdpDebuggerDataListHead

    PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其Act ...

  4. list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址

    #define list_entry(ptr, type, member) \ ((type *)(() -> member))) 解释: 1 在0这个地址看做有一个虚拟的type类型的变量,那 ...

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

    package main import "fmt" func main() { //每个变量都有两层含义,变量的内存和变量的地址 fmt.Printf("a = %d\n ...

  6. C++打印变量地址

    %p专门用来打印变量的以十六进制表示的地址: #include<iostream> using namespace std; int main() { ; printf("a的地 ...

  7. 打印变量地址-0x%08x

    地址是8个16进制数. 1.8个16进制数:相当于32个二进制数.4G内存刚好可以用32位的二进制表示出来.2.因为变量或函数等等在运行时都是存储在内存中的,所以你用取地址符当然是取出计算机内存中的地 ...

  8. c++中变量、变量名、变量地址、指针、引用等含义

    首先了解内存,内存就是一排房间,编号从0开始,0,1,2,3,4,5...... 房间里面一定要住人,新人住进去了,原来的人就走了:不管你住不住,里面都有人. 编号就是地址.里面的人就是内容,为了我们 ...

  9. Davinci-DM6467板子-外围器件的I2C地址的疑惑解答

    这篇文即调试标清视频或者说调试TVP5147和ADV7343所使用的程序名称为video_sd_playback_480i_composite 我们用的是合众达公司(SEED)的SEED-DVSD64 ...

随机推荐

  1. 反序列化漏洞问题研究之php篇

    php的反序列化反序列化漏洞又称php对象注入(php Object Injection)产生的问题主要分以下两类: 将传来的序列化数据直接unserilize,造成魔幻函数的执行.这种情况在一般的应 ...

  2. C/C++ 中的include

    当需要使用已有的方法或库时, 可以将它们的头文件#include进来. #include会在preprocess过程中被替换成它包含的代码. 头文件中包含了需要使用的函数/变量的声明. 当然声明与定义 ...

  3. Ajax跨域实现

    Ajax Ajax,Asynchronus JavaScript and XML,字母意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术.用于异步地去获取XML作 ...

  4. SVO原理解析

    最近空闲时间在研究Semi-Direct Monocular Visual Odometry(SVO)[1,2],觉得它值得写一写.另外,SVO的运算量相对较小,我想在手机上尝试实现它. 关于SVO的 ...

  5. 把url参数转化成一个对象返回

    var readUrlToParams = function () { var url = location.href; var nameValue; var paraString = url.sub ...

  6. PAT Basic Level 1001

    大纲考察内容 数据存储结构:数组.链 基础算法:递归.排序.计算时间复杂度.空间复杂度.分析算法稳定性 1001.害死人不偿命的(3n+1)猜想 (15) https://www.patest.cn/ ...

  7. CentOS7清理yum缓存和释放内存方法

    清理yum缓存 清理yum缓存使用yum clean 命令,yum clean 的参数有headers, packages, metadata, dbcache, plugins, expire-ca ...

  8. Node.js之路【第一篇】初识Node.js

    什么是Node.js 1.Node.js就是运行在服务端的JavaScrip. 2.Node.js是一个基于Chrome JavaScrip运行时简历的一个平台. 3.Node.js是一个非阻塞I/O ...

  9. SpringMVC学习记录5

    Springmvc流程中的扩展点有很多,可以在很多地方插入自己的代码逻辑达到控制流程的目的. 如果要对Controller的handler方法做统一的处理.我想应该会有很多选择,比如:@ModelAt ...

  10. 再谈如何使用Taglist?

    以前使用个taglist, 但是只是查看, 没有熟练的去使用, 补充一下: 参考文章: http://blog.csdn.net/vaqeteart/article/details/4146618 用 ...