我在用C语言处理字节数组时遇到一个数组与指针的问题。
当我使用指针时(如下)编译通过执行出错。
typedef unsigned char byte;
int main(){
printf("The program begins\n");
byte *head = {0xFE,0xFF};
printf("demo -> %.2x",head[1]);
return 0;
}
编译和执行结果错误
gcc -g -c demo.c
demo.c:13:19: warning: incompatible integer to pointer conversion initializing 'byte *' (aka 'unsigned char *') with an expression of type 'int' [-Wint-conversion]
byte *head = {0xFE,0xFF};
^~~~
demo.c:13:24: warning: excess elements in scalar initializer
byte *head = {0xFE,0xFF};
^~~~
2 warnings generated.
gcc -g -o demo demo.o tcp_handle.o
# xxx @ shuMacBook-Pro in ~/personal_data/leand/dome/C_dome/tcp_handle [23:47:47]
$ ./demo
The program begins
[1] 74322 segmentation fault ./demo
而当我使用数组时(如下),却能正常执行
typedef unsigned char byte;
int main(){
printf("The program begins\n");
byte head[] = {0xFE,0xFF};
printf("demo -> %.2x",head[1]);
return 0;
}
结果
gcc -g -c demo.c
gcc -g -o demo demo.o tcp_handle.o
# xxx @ shuMacBook-Pro in ~/personal_data/leand/dome/C_dome/tcp_handle [23:56:19]
$ ./demo
The program begins
demo -> ff%
通过编译时的提示,我大概猜测使用指针时,把十六进制的元素当作整型存储了,并把首地址赋值给力head。但是为什么数组却能将内部的元素当作定义时的类型存储呢?我对C语言指针和数组这方面的知识比较欠缺。希望能被点醒。或推荐一些资料(看过一些帖子,没有遇到相似情况的)。
第一个指针的应用需要申请内存空间,你后面的元素是常数,地址在常量池里面。常量池里面的内存销毁或者啥的是操作系统去完成的。
第二个数组,数组这样定义是会根据元素个数自动向系统申请内存空间。
我们常用指针指向数组,而不是指针指向常数,不然会经常出现一些莫名的错误。跟操作系统有关的东西,至少。。。我不明白
这个不是数组的问题了,而且指针的问题
byte *head = {0xFE,0xFF};
这个是创建了一个指针,而这个指针是不能赋值的,实际上是没有这个数组的
byte head[] = {0xFE,0xFF};
这个是正常的创建,就不多说了
如果你要使用指针的话,正确的使用方式应该是
typedef unsigned char byte;
int main(){
printf("The program begins\n");
byte head[2]; //创建一个数组,系统会自动分配内存
byte *p = &head; //创建一个数组指针,将刚刚创建的数组赋给p,实际上p是一个指向head内存地址的一个指针变量
p = {0xFE,0xFF};
printf("demo -> %.2x",head[1]);
return 0;
}