gpt4 book ai didi

C 基本字符串问题

转载 作者:行者123 更新时间:2023-11-30 18:31:49 26 4
gpt4 key购买 nike

我想知道 char* 是否被存储,以及如何使用户输入,例如他的名字,然后使用 printf 打印出来......

char *name = "Adam"; 

/*where does this store itself?
does the memory allocate the necessary memory stroage for this
please explain this simply and fully if you can
*/

//and btw

char name2[] = "Adam";

//what is the diffrence between name and name2

最佳答案

字符串文字的确切存储位置很大程度上取决于各个实现;唯一的要求是文字对整个程序可见,并且在程序启动时分配并保留到程序终止。

某些平台可能会将文字存储在不同的内存段中(例如.rodata)。

至于区别

char *name = "Adam";

char name2[] = "Adam";

一张图片可能会有所帮助。以下是我的特定系统上的运行情况:


Item Address 00 01 02 03
---- ------- -- -- -- --
"Adam" 0x400ac0 41 64 61 6d Adam
0x400ac4 00 22 41 64 ."Ad

name 0x7fff39dbdb78 c0 0a 40 00 ..@.
0x7fff39dbdb7c 00 00 00 00 ....

name2 0x7fff39dbdb70 41 64 61 6d Adam
0x7fff39dbdb74 00 7f 00 00 ....

字符串文字 "Adam" 存储为从地址 0x400ac0 开始的 char 数组(位于 .rodata 段中)我的系统)。

变量name是一个指向char的指针,包含字符串文字的地址(我的系统是小端字节序,所以地址读作“向后”)。

变量name2是一个char数组,其内容是从字符串文字复制的。

编辑

查看生成的机器代码可能更有帮助。采用以下程序:

#include <stdio.h>

int main( void )
{
char *name = "Adam";
char name2[] = "Adam";

printf("name = %s, name2 = %s\n", name, name2 );
return 0;
}

我在 SLES 10 系统上使用 gcc 编译它,如下所示:

gcc -o name2 -std=c99 -pedantic -Wall -Werror name2.c -Wa,-aldh=name2.lst

这在 name2.lst 中给了我以下汇编器输出:

GAS LISTING /tmp/ccuuqqGI.s                     page 1

1 .file "name2.c"
2 .section .rodata
3 .LC0:
4 0000 4164616D .string "Adam"
4 00
5 .LC1:
6 0005 6E616D65 .string "name = %s, name2 = %s\n"
6 203D2025
6 732C206E
6 616D6532
6 203D2025
7 .text
8 .globl main
10 main:
11 .LFB2:
12 0000 55 pushq %rbp
13 .LCFI0:
14 0001 4889E5 movq %rsp, %rbp
15 .LCFI1:
16 0004 4883EC10 subq $16, %rsp
17 .LCFI2:
18 0008 48C745F8 movq $.LC0, -8(%rbp)
18 00000000
19 0010 8B050000 movl .LC0(%rip), %eax
19 0000
20 0016 8945F0 movl %eax, -16(%rbp)
21 0019 0FB60500 movzbl .LC0+4(%rip), %eax
21 000000
22 0020 8845F4 movb %al, -12(%rbp)
23 0023 488D55F0 leaq -16(%rbp), %rdx
24 0027 488B75F8 movq -8(%rbp), %rsi
25 002b BF000000 movl $.LC1, %edi
25 00
26 0030 B8000000 movl $0, %eax
26 00
27 0035 E8000000 call printf
27 00
28 003a B8000000 movl $0, %eax
28 00
29 003f C9 leave
30 0040 C3 ret
31 .LFE2:

如您所见,字符串文字 "Adam""name = %s, name2 = %s\n" 存储在 . rodata 部分(用于只读数据项)。第 18 行将字符串文字的地址复制到 name,而第 19 行到 22 行将字符串文字的内容复制到 name2。

关于C 基本字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com