永发信息网

声明的数组在内存中一定是连续存放的吗

答案:2  悬赏:80  手机版
解决时间 2021-01-27 21:55
  • 提问者网友:树红树绿
  • 2021-01-27 15:51
声明的数组在内存中一定是连续存放的吗
最佳答案
  • 五星知识达人网友:怙棘
  • 2021-01-27 16:59
都是连续的
全部回答
  • 1楼网友:患得患失的劫
  • 2021-01-27 17:40
你这种写法确实是可以修改的,因为你没有把a声明成const(注意,const其实不完全表示常量).按你的想法,应该声明成const char a[] = "hellow world"; 不过这样的确会出现你说的问题,a是可以修改的.原因的话其实算是c本身的缺陷了,反汇编一下就可以解释了. 源代码: #include int main(int argc, char *argv[]) { char * a = "abcd"; const char b[] = "efgh"; return 0; } 反汇编代码: .file "a.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" lc0: .ascii "abcd\0" lc1: .ascii "efgh\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $20, %esp call ___main movl $lc0, -8(%ebp) movl lc1, %eax movl %eax, -13(%ebp) movzbl lc1+4, %eax movb %al, -9(%ebp) movl $0, %eax addl $20, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret 可以发现,c语言对两种情况是不同处理的.具体为什么不同我也不太清楚,推荐你看看c专家编程这本书,里面有详细的解释 楼下的可能没看明白我的意思, 如果代码是这样 #include int main(int argc, char *argv[]) { const char a[] = "hello world"; char *p = a; //a[2] = 'q'; p[1] = 'g'; printf("%s, %s\n", a, p); } 这段代码是可以运行的. 也就是说, 就算a里面存放的是字符串常量, p还是可以修改a的值, 然而这时直接修改a却是不行的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯