在C中只读字符串

时间:2013-10-18 05:53:22

标签: c string pointers

在阅读“只读”字符串时,会遇到以下代码段。

#include<stdio.h>
main()
{
    char *foo = "some string";
    char *bar = "some string";
    printf("%d %d\n",foo,bar);
}

我所理解的是foo和bar都会打印相同的地址,但我无法理解后台实际发生了什么。即,当字符串相同时,它将返回相同的地址,但是当我修改字符串时,地址是不同的。

2 个答案:

答案 0 :(得分:5)

enter image description here

  

foobar都将打印相同的地址

实际上,根据标准,它们不需要具有相同的地址,它是未指定的。但实际上,大多数编译器都会使相同的字符串文字保持相同的地址。

你不能修改字符串文字,我认为你的意思是你使用不同的字符串文字,在这种情况下,字符串显然会包含不同的地址。

  

C11 6.4.5字符串文字

     

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。

enter image description here

答案 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”修改。这将导致运行时异常。