gpt4 book ai didi

c - 为什么将文本分配给指针会将内存位置存储到文本?

转载 作者:行者123 更新时间:2023-11-30 20:47:49 27 4
gpt4 key购买 nike

我在某处读到过

char array[] = "abc";

将堆栈存储数组中的前四个元素设置为 'a''b''c''\0',并且:

char *pointer = "abc";

将指针设置为“abc”字符串的地址。我理解为什么第一行代码的行为如此,但为什么第二行代码的行为如此——我本以为堆栈中有一个名为“指针”的 block ,存储与 “abc” 等效的十六进制/ASCII (作为对应于某个任意内存位置的数字)。换句话说,我希望将“abc”存储为内存地址,因为您将其分配给存储内存地址的指针。为什么计算机相反地选择存储“abc”地址,而不是存储“abc”(或十六进制/数字等价物)本身,作为指针?

最佳答案

声明 char array[] = "abc" 为您提供了一个如下所示的数据结构:

       +---+---+---+---+
array: | a | b | c |\0 |
+---+---+---+---+

声明 char *pointer = "def" 为您提供了一个如下所示的数据结构:

         +-------+
pointer: | * |
+---|---+
|
v
+---+---+---+---+
| d | e | f |\0 |
+---+---+---+---+

这里,“def”本质上存储在编译器在某处分配的未命名数组中,并且指针被初始化为指向它。

无论数组指针是本地变量还是全局变量(堆栈或静态分配),这或多或少都适用。

如果我们开始实际打印这些地址,它会变得更有趣(或者可能更令人困惑):

printf("&pointer = %p, pointer = %p\n", &pointer, pointer);
printf("&array = %p, array = %p\n", &array, array);

当我在我的机器上运行这个时,我得到:

&pointer = 0x102e99020, pointer = 0x102e98fa2
&array = 0x102e99018, array = 0x102e99018

所以变量array的地址是0x102e99018,变量pointer的地址是0x102e99020 ,并且包含字符串“def”的未命名数组位于地址0x102e98fa2

pointer是一个普通的指针变量,因此它所包含的指针值与其本身的地址不同。然而,由于 array 是一个数组,只要在表达式中提及它,您就会获得它的地址,因此 array&array 的指针值看起来像是是一样的。

关于c - 为什么将文本分配给指针会将内存位置存储到文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57242250/

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