我有一个这样的程序(x86_64gnu/Linux)

int main()
{
    char s[] = "123456789";
    char d[] = "123";
    strcpy(d, s);

    printf("%p, %0p\n", s, d);
    printf("%s, %s", s, d);

    return 0;
}

输出为:0xeb6d2930 0xeb6d2910
123456789 123456789
我对结果有点困惑
我想记忆中的程序是这样的:
'9','\0'。.
'5','6','7','8'
0x7fff813af310:'1','2','3','4'
0x7fff813af300:“1”、“2”、“3”、“0”
所以结果应该是*s=”789”,*d=”123456789”
你们能解释一下为什么结果不像我想的那样吗?
我将格式说明符更改为%p以打印d和s的地址
我知道s和d是重叠的,所以没有足够的空间容纳d
可能会导致不确定的行为,但无论如何我想知道
为什么结果是*s=“123456789”*d=“123456789”

最佳答案

从输出中可以看到地址布局,其初始内容似乎是:

       offset 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
d: 0xeb6d2910 30 31 32 00 xx xx xx xx xx xx xx xx xx xx xx xx | 1 2 3 . . . . . . . . . . . . .
   0xeb6d2920 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx | . . . . . . . . . . . . . . . .
s: 0xeb6d2930 30 31 32 33 34 35 36 37 38 39 00 xx xx xx xx xx | 1 2 3 4 5 6 7 8 9 . . . . . . .

strcpy(d, s)之后:
       offset 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
d: 0xeb6d2910 30 31 32 33 34 35 36 37 38 39 00 xx xx xx xx xx | 1 2 3 4 5 6 7 8 9 . . . . . . .
   0xeb6d2920 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx | . . . . . . . . . . . . . . . .
s: 0xeb6d2930 30 31 32 33 34 35 36 37 38 39 00 xx xx xx xx xx | 1 2 3 4 5 6 7 8 9 . . . . . . .

但是,对于d来说,在strcpy()期间使用的内存分配较少,代码调用undefind行为。

关于c - 内存中的strcpy和字符串表示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23061492/

10-11 22:09