1

在阅读有关“只读”字符串并遇到以下代码段时。

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

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

4

2 回答 2

7

在此处输入图像描述

foo两者bar都将打印相同的地址

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

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

C11 6.4.5 字符串文字

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

在此处输入图像描述

于 2013-10-18T06:05:34.293 回答
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] 指向同一个地址。在这种情况下,不允许修改“某些字符串”。这将导致运行时异常。

于 2013-10-18T06:04:07.543 回答