声明的数组在内存中一定是连续存放的吗
答案: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却是不行的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯