shuouyang 2021-03-14 00:08 采纳率: 33.3%
浏览 73
已采纳

C语言数组与指针在定义时赋值有哪些区别

我在用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语言指针和数组这方面的知识比较欠缺。希望能被点醒。或推荐一些资料(看过一些帖子,没有遇到相似情况的)。

  • 写回答

2条回答 默认 最新

  • 小白小白你好菜 2021-03-14 00:21
    关注

    第一个指针的应用需要申请内存空间,你后面的元素是常数,地址在常量池里面。常量池里面的内存销毁或者啥的是操作系统去完成的。

    第二个数组,数组这样定义是会根据元素个数自动向系统申请内存空间。

    我们常用指针指向数组,而不是指针指向常数,不然会经常出现一些莫名的错误。跟操作系统有关的东西,至少。。。我不明白

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出