字符指针和字符数组

为什么前面两个不相同,后面两个相同的地址

#include<stdio.h>
int main(void)
{
    char ch[]="asdfg";
    char cj[]="asdfg";
    char *p="asdfg";
    char *j="asdfg";
    printf("%p\n",ch);
        printf("%p\n",cj);
            printf("%p\n",p);
                printf("%p",j);
    return 0;
 } 
阅读 1.5k
1 个回答
  • 数组声明是编译器自动分配一片连续的内存空间,空间名为数组名
  • 指针声明是只分配了用于容纳地址值的 4 字节空间

image.png


补充:

  • 关于 chcj, 在栈中分配空间用于存储实际的数据 (如果有全局属性,则存储在 data 段)
  • 可进行 ch[0] = 'd' 的赋值操作。
  • 因为数组是一片连续的内存空间存储数据,所以 chcj 地址不同,只是初始存储值相同

  • 关于 pj 在栈中分配空间存储其它地址值 (如果有全局属性,则存储在 data 段)
  • 可进行 p = other_addr 的赋值操作;但 *p = 'd'(等价于p[0]='d') 将引发运行时异常
  • &p, &j 本身地址不同,但指向可以相同。
  • 初始化时编译器做的内存优化,"asdfg"只需要一份,并且存储在'rodata' 段,因此 pj 指向相同
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进