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指向同一段数据 

  

  

  

  

  

  

时间: 2024-10-14 17:56:41

go:关于变量地址的疑惑的相关文章

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

测试函数的模板实现 [cpp] view plain copy /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #define MY_TEMPLATE_H_2016_0123_1226 template<int iArySize> void fnTestDataType() { char szBuf[iArySize] = {'\0'}; unsigned short wT

关于“在本类中访问本类私有静态变量”的一点疑惑解析

关于"在本类中访问本类私有静态变量"的一点疑惑解析 代码如下: public class StaticVar { private static int x = 100; public static void main(String[] args) { StaticVar var1 = new StaticVar(); var1.x++; StaticVar var2 = new StaticVar(); var2.x++; StaticVar.x++; System.out.print

1/10 .c--进制 获取变量地址

模块化编程的概念:把功能相似的函数封装到不同的文件中. 好处: 1)用的时候,只需包含.h的文件,对外隐藏源文件的实现. 2)团队的分工协作 3)可以把细化若干个模块 实现:创建.c 的C语言源文件,.h(header)头文件(可做方法的声明) 1)方法的声明,但是不能实现方法 2)声明变量 3)声明结构体 7-5(进制) 7 6 5 4 3 2 1 0 //数位 1 0 0 0 1 1 1 1 //数码 //位权=数码值*基数^数位 (基数=几进制基数就是几) /* 10->2 除2取余,把1

c++的for循环中变量地址问题

for f(int i; i<10; i++) { int c=0; cout<<c<<&c<<endl; } 看这个简单的代码,新玩家容易有这样的认识:既然for循环中的代码被循环执行,那么为什么变量c没有被重定义呢. 这个问题看过任何一本c++教材头两章的都能解答,是因为作用域的存在.变量c在每一次循环结束后存储空间会被释放掉,而在下一次循环开始的时候再次定义. 那么,第二次循环中的变量的地址和第一次循环变量的地址是在同一个存储位置吗? 答案是肯定的.

变量名和变量地址

变量名和变量地址 研一时,很偶然的翻开谭浩强老先生的<C程序设计>(是师姐的书,俺的老早就卖了,估计当时觉得这本书写得不够好),很偶然的看到关于变量名的一段话:"变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址.在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据." 当时很震惊上课的时候居然没有发现这句蛮有深意的话语,可是研一的时候还是没有完全明白,只是知道有这么几个东西:变量名.内存地址.变量值.后来看到指

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

PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其ActiveProcessList域将被作为节点加入到此链表中:当进程被删除时,则从此链表中移除,如果windows需要枚举所有的进程,直接操纵此链表即可. 方法一:从KdInitSystem函数地址处硬编码搜索 方法二:从System进程(pid=4)的PEPROCESS地址获取 方法三:从ntoskr

父子进程 变量地址相同

fork 进程 A 有 变量 m,地址为 12345 进程 B 为 A 的子进程,此时 B 会有一份 和 A 一样的 内存空间(逻辑),同样 会有 m 变量,它的 地址 也是 12345 当修改 A 中的 m 时,不影响 B 中的 m,因为 虽然它们的线性地址 相同, 但是 对应的 物理地址 却 不相同. 父进程 子进程 是两个 不同的程序!!!

程序基址与变量地址偏移初探

1.这个程序是我对程序基地址和偏移量的一个测试程序,先上代码,代码运行的主要任务是打印各种变量和函数的地址 1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<windows.h> 4 5 int number; 6 int mmpe; 7 int qq; 8 int qo = 100; 9 10 11 int add(int a, int b) 12 { 13 printf("%p\n", &am

[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的地址 //声明(定义