Chinaunix首页 | 论坛 | 博客
  • 博客访问: 257110
  • 博文数量: 49
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 510
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-13 00:59
个人简介

make it run,make it better,make it fast. https://github.com/liulanghaitun

文章分类

全部博文(49)

文章存档

2023年(1)

2022年(2)

2020年(4)

2019年(4)

2017年(15)

2016年(3)

2014年(3)

2013年(14)

分类: LINUX

2017-11-16 21:50:25

源文件:src.c

点击(此处)折叠或打开

  1. #include<stdio.h>

  2. char message[]="hello world!";
  3. char* base="hello world!";

  4. void print_message()
  5. {
  6.     printf("src_message==0x%x,src_base==0x%x\r\n",message,base);
  7. }
主文件:main.c

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. extern char *message;
  3. extern char base[];

  4. int main()
  5. {
  6.     print_message();
  7.     printf("dest_message==0x%x,dest_base==0x%x\r\n",message,base);
  8.     return 0;
  9. }
代码执行结果:

变量base的内存:


变量message的内存:

变量内容和变量的内存布局可知:
1)当定义为数组而声明为指针的时候(message)
定义src_message的值对应message内存0x601030,即表示字符串h的地址(数组第一个元素的地址)
声明为指针的时候,dest_message的值为0x6c6c6568,该值刚好是hell四个字符对应的数值.
综上所述:定义为数组而声明为指针的时候,把数组的值当作地址,对指针解引用的时候可能会挂掉.
2)当定义为指针而声明为数组的时候(base)
定义src_base的值对应0x400600,即该指针保存的是字符串对应的地址,通过获取内存数据可知0x400600刚好对应hello world!
声明为数组的时候,dest_base的值为0x601040,该值刚好对应指针本身的地址.
综上所述:定义为指针而声明为数组的时候,数组对应的地址是指针自己的地址,对该地址进行操作可能会挂掉.

所以:
1)定义数组的时候数组是数组,指针是指针,定义和声明要保持一致
2)使用sizeof对数组进行取值的时候,数组还是数组
3)其他情况数组会退化为指针,指针和数组是等价的
阅读(2546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~