在阅读有关“只读”字符串并遇到以下代码段时。
#include<stdio.h>
main()
{
char *foo = "some string";
char *bar = "some string";
printf("%d %d\n",foo,bar);
}
我理解的是 foo 和 bar 都将打印相同的地址,但我无法理解后台实际发生的情况。即当字符串相同时,它将返回相同的地址,但是当我修改字符串时,地址不同。
foo
两者bar
都将打印相同的地址
实际上,根据标准,它们不需要具有相同的地址,它是未指定的。但在实践中,大多数编译器都会使相同的字符串文字保持相同的地址。
您不能修改字符串文字,我认为您的意思是您使用不同的字符串文字,在这种情况下,很明显字符串将包含不同的地址。
C11 6.4.5 字符串文字
如果它们的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为未定义。
构建代码
gcc yourcode.c -S -o yourcode.S
.file "main.c"
.section .rodata
.LC0:
.string "some string"
.LC1:
.string "%d %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movq $.LC0, -16(%rbp)
movq $.LC0, -8(%rbp)
movl $.LC1, %eax
movq -8(%rbp), %rdx
movq -16(%rbp), %rcx
movq %rcx, %rsi
movq %rax, %rdi
movl $0, %eax
call printf
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-10ubuntu1) 4.6.3 20120918 (prerelease)"
.section .note.GNU-stack,"",@progbits
[char * foo] 和 [char *bar] 指向同一个地址。在这种情况下,不允许修改“某些字符串”。这将导致运行时异常。