在阅读“只读”字符串时,会遇到以下代码段。
#include<stdio.h>
main()
{
char *foo = "some string";
char *bar = "some string";
printf("%d %d\n",foo,bar);
}
我所理解的是foo和bar都会打印相同的地址,但我无法理解后台实际发生了什么。即,当字符串相同时,它将返回相同的地址,但是当我修改字符串时,地址是不同的。
答案 0 :(得分:5)
foo
和bar
都将打印相同的地址
实际上,根据标准,它们不需要具有相同的地址,它是未指定的。但实际上,大多数编译器都会使相同的字符串文字保持相同的地址。
你不能修改字符串文字,我认为你的意思是你使用不同的字符串文字,在这种情况下,字符串显然会包含不同的地址。
C11 6.4.5字符串文字
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。
答案 1 :(得分:1)
使用
构建代码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]指向同一地址。在这种情况下,不允许“some string”修改。这将导致运行时异常。