源文件:src.c
-
#include<stdio.h>
-
-
char message[]="hello world!";
-
char* base="hello world!";
-
-
void print_message()
-
{
-
printf("src_message==0x%x,src_base==0x%x\r\n",message,base);
-
}
主文件:main.c
-
#include <stdio.h>
-
-
extern char *message;
-
extern char base[];
-
-
int main()
-
{
-
print_message();
-
printf("dest_message==0x%x,dest_base==0x%x\r\n",message,base);
-
return 0;
-
}
代码执行结果:
变量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) |