gpt4 book ai didi

c++ - char* textMessages[] 在内存中是如何格式化的?

转载 作者:太空宇宙 更新时间:2023-11-04 16:00:29 26 4
gpt4 key购买 nike

正如我们所知,多数组如 int array1[3][2] = {{0, 1}, {2, 3}, {4, 5}};是连续的,所以它与 int array2[6] = { 0, 1, 2, 3, 4, 5 };

完全相同
for (int *p = *array1, i = 0; i < 6; i++, p++)
{
std::cout << *p << std::endl;
}

0

1

2

3

4

5

然后,我有这些代码:

char *textMessages[] = {
"Small text message",
"Slightly larger text message",
"A really large text message that ",
"is spread over multiple lines*"
};

我发现它的布局和int[3][2]不一样:

  • 对于每个子消息,如 “Small text message”,每个 alpha 都是连续的并且偏移量是 1(sizeof(char) == 1)。
  • 但是,"Small text message" 的最后一个元素 -- e"Slightly larger text message" 的第一个元素 - - S 在内存中不连续:

char *textMessages[] = {
"Small text message",
"Slightly larger text message",
"A really large text message that ",
"is spread over multiple lines*"
};
char *a = *(textMessages)+17, *b = *(textMessages + 1), *c = *(textMessages + 1) + 27, *d = *(textMessages + 2), *e = *(textMessages + 2) + 31, *f = *(textMessages + 3);
std::ptrdiff_t a_to_b = b - a, c_to_d = d - c, e_to_f = f - e;
printf("they(a b c d e f) are all messages's first or final element: %c %c %c %c %c %c\n", *a, *b, *c, *d, *e, *f);
printf("\n\naddress of element above: \n%p\n%p\n%p\n%p\n%p\n%p\n", a, b, c, d, e, f);
printf("\n\nptrdiff of a to b, c to d and e to f: %d %d %d\n", a_to_b, c_to_d, e_to_f);

they(a b c d e f) are all messages' first or final element: e S e A t i


address of element above:
002F8B41
002F8B44
002F8B5F
002F8B64
002F8B83
002F8B88


ptrdiff of a to b, c to d and e to f: 3 5 5

我的问题是:

  1. 3 5 5 在这里是什么意思?
  2. 为什么是 3 5 5,而不是 5 5 5
  3. 这里的布局是怎样的?

编辑:我不认为这个问题与 How are multi-dimensional arrays formatted in memory? 重复,因为我问的与那个问题的疑问不同,解决方案不应该是问题的答案。

最佳答案

How is char* textMessages[] formatted in memory?

就像其他一维数组一样。每个元素都存储在一个连续的内存位置。这些元素是指向 char 对象的指针。

这些指针中的每一个都指向字符串文字的开头。字符串文字具有静态存储持续时间,并且它们的内存位置是实现定义的。

What does 3 5 5 mean here?

您已经完成了不指向同一数组的指针之间的指针减法(每个字符串文字都是一个单独的数组)。因此,程序的行为在技术上是未定义的。

在实践中,大多数时候,你得到的是内存中指向值的距离。由于这些数组的位置是实现定义的,因此这些值没有任何意义。

Why 3 5 5, not 5 5 5

  • 因为行为未定义
  • 因为那恰好是指针字符对象之间的距离。距离将取决于编译器选择存储字符串文字的位置。

您可以根据自己的观点选择任何一种解释。


附言。您正在将字符串文字转换为指向非常量字符的指针。自 C++ 标准化以来,此转换已被弃用,并且自 C++11 以来格式错误。

PPS。访问 int *p = *array1 超出大小为 2 的 array1[0] 的边界,就像在您的第一个代码片段中一样,在技术上具有未定义的行为。这同样适用于第二个 *(textMessages + 2) + 31

关于c++ - char* textMessages[] 在内存中是如何格式化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45412218/

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