gpt4 book ai didi

c - 了解字符串指针数组

转载 作者:行者123 更新时间:2023-11-30 15:16:55 26 4
gpt4 key购买 nike

我试图理解引用指针“p”时收到的结果。我已在线发表评论,说明我认为正在发生的事情。

#include <stdio.h>

main()
{
char *words[] = { "hello", "world" };
char **p = words; // p is now pointing to words[0]?

++p; // p now points to "world"

printf("%s\n", *p); // Prints the character string 'world', pointed to by p
printf("%c\n", *p[0]); // Returns 'w'
printf("%c\n", *p[1]); // Should return 'o'? Returns garbage
printf("%c\n", *++p[0]); // Returns 'o'?
}

我的理解是之后:

char **p = words;

That p now points to the first character pointed to by words[0], i.e., the 'h' in 'hello'. Then after:

++p

p now points to the first character pointed to by the pointer at words[1], i.e., the 'w' in 'world'.

The results:

world
w
<blank space>
o

如果 *p[0] 返回字符“w”。那么,为什么 *p[1] 返回垃圾呢?我试图了解 *words 中的指针指向的内容是如何在内存中组织的,然后,每次调用后 p 指向的位置。

更新

通过更改以下行:

    printf("%d\n", *p[0]);         
printf("%d\n", *p[1]);
printf("%d\n", *++p[0]);

现在的结果是:

119 // 'w'
1 // 'SOH' -- Start of heading
111 // 'o'

现在,在这种情况下,SOH 字符到底是什么?

最佳答案

有一些误解。

之后的内存布局:

char *words[] = { "hello", "world" };

看起来像:

words[0]    words[1]
| |
v v
+-----------+-----------+
| ptr1 | ptr2 |
+-----------+-----------+


ptr1
+---+---+---+---+---+------+
| h | e | l | l | o | '\0' |
+---+---+---+---+---+------+

ptr2
+---+---+---+---+---+------+
| w | o | r | l | d | '\0' |
+---+---+---+---+---+------+

你说:

char **p = words;              // p is now pointing to world[0]?

如果您的意思是words[0],那么您是对的。

你还说,

That p now points to the first character pointed to by words[0]

这是不正确的。 p 的类型是 char**。您可以说 *p 指向 words[0] 指向的第一个字符。

关于程序的输出...

你有一行:

++p;

此行更改 p,使其指向 words[1]

线路

printf("%c\n", *p); // Should return 'w'? But returns garbage

是导致未定义行为的原因,因为 *p 的类型不是表示 charint*p 的类型是 char*,而不是 char

线路

printf("%c\n", *p[0]);         // Returns 'w'

打印w,因为p[0]等于ptr2。正如您从内存布局中看到的,*ptr2 的计算结果为'w'。因此,您会在输出中得到 w

线路

printf("%c\n", *p[1]); // Should return 'o'? Returns garbage

也是导致未定义行为的原因。

由于运算符优先级,*p[1] 等价于 *(p[1]),后者等价于 *(*(p +1))。由于 p 已指向 words[1],因此 (p+1) 指向无效内存。

关于c - 了解字符串指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814759/

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