大家来看看这个题为什么选这个?(我十分郁闷)
char c;
char *const pc= "asdf " (B)是正确的。
A pc= "dfgh "
B *pc= 'b '
C *pc++= 'y '
D pc=&c
[解决办法]
因为把const 放在char*后面表示的是常量指针,就是说它指向的地址是不能变的,但是它指向的内容可以被修改(用*运算符)。
[解决办法]
因为const修饰的是指针,而不是修饰的指针所指向的变量,所以当然可以改变指针所指向的内容啦
[解决办法]
都不正确!
char *const pc= "asdf ";
此时pc指向字符串 "asdf "所在的内存,而字符串常量为只读数据,通常安排在.rodata节,在代码段中*pc= 'b '会引起保护错。
int main(void)
{
char c;
char *const pc= "asdf ";
*pc= 'b ';
return 0;
}
编译后的汇编代码:
.file "hello.c "
.section .rodata
.LC0:
.string "asdf "
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movq $.LC0, -8(%rbp)
movq -8(%rbp), %rax
movb $98, (%rax)
movl $0, %eax
leave
ret
.LFE2:
.size main, .-main
.section .eh_frame, "a ",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR "
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.ident "GCC: (GNU) 4.1.1 20061011 (Red Hat 4.1.1-30) "
.section .note.GNU-stack, " ",@progbits
[解决办法]
想编译通过,这四个答案都是错的.
但如果指向的不是字符串常量而是数组的话,
B是对的,楼上都说的很清楚了
[解决办法]
好象都不正确吧
[解决办法]
char *const pc= "asdf ";
这样赋值的结果是:指针内容不能修改,指针所指向的内容为常量字符串也不允许修改。所以答案都不对
[解决办法]
pc不能改就对了,不过B也不全对。
[解决办法]
都不对;
B只能编译通过,在执行时段错误
大家来看看这个题为什么选这个?(小弟我十分郁闷)
大家来看看这个题为什么选这个?(我十分郁闷)charcchar*constpc asdf (B)是正确的。Apc dfgh B*pc b
