内存排布

#include<stdio.h>

int main(void)
{
  char *str1 = "Hello, World!";
  char str2[] = "Hello, World!";
  str1[1] = '!';
  printf("%s", str1);
}

//这个内容在《征服C指针》中看到过XD。那本书里讲到[]在使用的时候其实就是*(pt+n)的一个语法糖而已
//但是在声明的时候,*声明的是一个指针,而[]则声明的是一个数组。
//区别就在于,*只是在内存中分配了一个sizeof(char *)的一个空间;
//而[]则是在内存中开辟了一段存储这段字符串的空间。
//编译器在编译的时候,会将字符串先分配到程序段的开始(忘记细节了,这本书被我还了),是一个只读常量
//然后其实就是把那个字符串的地址赋值给了str1
//我又试着修改这个字符串,结果就是访问冲突,没有权限修改
//这两个东西让我想到了之前看的16位汇编,[]用来表示偏移地址,也可以2[bx]or[bx+2]
//以及,汇编代码中的data段,and汇编也可以在code段最开始放数据.他们两个具体有什么区别我就不太知道了
//不过一个段地址是data的段地址,一个的段地址是code的段地址;一个通常用ds来存,一个就是CS中的内容
//他们实质性的区别我就不知道了
//毕竟、我感觉在16位DOS上的汇编,啥都可以随便改,什么东西都只是一串数字,可以把它当数据也可以把它当指令

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒