gpt4 book ai didi

c++ - char指针数组输出是不同的c++

转载 作者:行者123 更新时间:2023-11-28 03:06:56 25 4
gpt4 key购买 nike

虽然我在 C++ 中尝试了一些使用 char* 数组的示例程序,但程序的输出对我来说不是很清楚。

示例代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>

using namespace std;

int main()
{
string val="val1";
char* hello[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};

hello[1]=(char*)val.c_str();

val="val2";

printf("The val in hello[1] is :%s\n",hello[1]);

hello[3]=(char*)val.c_str();

printf("The val in hello[3] is :%s\n",hello[3]);
}

结果:

The val in hello[1] is :val2

The val in hello[3] is :val2

但是我在同一个程序中附加了字符串

val.append("val2"); //val="val2";

结果是

The val in hello[1] is :val1

The val in hello[3] is :val1val2

您能解释一下输出如何给出 2 个不同的结果吗?

最佳答案

string.c_str() 返回 string 使用的内部 char* 缓冲区。

当您第一次通过c_str() 获取指向内部缓冲区的指针并将其存储在hello[1] 中时,缓冲区包含"val1"。在下一行,您用值 "val2" 覆盖字符串。由于 "val1""val2" 的长度相同,新值适合原始缓冲区,因此被覆盖。

相比之下,当您将 "val2" 附加到 val 时,原来的内部缓冲区肯定太小而无法容纳结果,因此它会分配一个新缓冲区。因此,hello[1]hello[3] 指向两个不同的 char*,它们具有不同的值。

通过在程序末尾添加几行,您可以看到两台打印机不相等:

printf("Pointer in hello[1]: %p\n", hello[1]);
printf("Pointer in hello[3]: %p\n", hello[3]);

我在测试运行中得到了这些结果:

Pointer in hello[1]: 0x10ca00a68
Pointer in hello[3]: 0x10ca00a88

调用 append 显然会强制字符串分配一个新的、更大的缓冲区。但是,您不能保证 hello[1] 中的缓冲区将保持其当前值,因为如果您创建另一个,string 实现可能会决定稍后重用该缓冲区调用一个字符串方法——甚至可能在另一个字符串上。

关于c++ - char指针数组输出是不同的c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19441770/

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