gpt4 book ai didi

c++ - 将上一行中的 Char* 常量添加到 Char* 数组中

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:06 25 4
gpt4 key购买 nike

当我处理一个小的头文件时,我遇到了一些奇怪的事情。基本上,我声明了一个 char* 变量"file"。在下一行中,我创建了一个带有一些设置值的 char*[] 数组。但是,每次我对此进行测试时,"file"中的“test.txt”内容都会附加到“数据[]”的末尾......我不知道为什么。附件是我可以获得代码的最简单的表格。

在我的文件 main.cpp 中:

#include <iostream>
using namespace std;

int main() {
char* file = "test.txt";
const char* data[] = {"test6", "test7", "test8"};

for (int i = 0; i < 4; i++)
{
cout << data[i];
}

return 0;
}

我只是简单地编译

g++ main.cpp

是的,我确实在循环中使用了一个设定值(“4”)。没关系,但我使用了一个设定值,因为“sizeof(data)”使它崩溃。

(同时忽略"file"变量名……这段代码实际上与文件写入没有任何关系。)

编译时,我得到

main.cpp: In function 'int main()':
main.cpp:5:18: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
char* file = "test.txt";
^

...虽然这应该不会有太大影响。

将类型更改为“const char*”甚至“string”都不起作用。

有谁知道如何解决这个问题?还是只有我?

最佳答案

data 中的元素数量是 3,而不是 4,因此您在循环中访问了越界数据。其结果是未定义的行为。由于未定义的行为 - 好吧,未定义 - 任何事情都有可能发生。

你可以这样做:

for (int i = 0; i < sizeof data / sizeof *data; i++)
{
cout << data[i];
}

您必须进行除法的原因是 sizeof data 等于 data 中元素的数量(即 3)乘以每个元素的大小(即可能是 4 或 8,具体取决于您的编译器)。所以你必须除以每个元素的大小。 (元素是指针,不是字符。)

至于警告,您可以像这样声明 file:

const char *file = "test.txt";

关于c++ - 将上一行中的 Char* 常量添加到 Char* 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50302642/

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