为什么传递char[]不起作用,而(不推荐使用的转换)char*起作用
why does passing char[] not work, but (deprecated conversion) char* does?
我无法解释以下行为的原因。我初始化了两段文本,一段为char*,另一段为char[],并将它们放入一个结构中。两者在结构中看起来都很好,但总的来说,第二个丢失了,第一个给了我一个编译器警告,我理解这一点(不赞成从字符串常量转换为char*)。
这是我在这里问的第一个问题,我为做错的事情道歉。是的,我尝试过搜索,但与char*和char[]有关,出现了很多问答;A、 我发现没有一个类似于我遇到的嵌套问题。
从附加的代码中,我得到了输出:
get_struct: 5 test test2
main: 5 test
(末端的测试2缺失)
所以代码:
#include <iostream>
typedef struct {
double a_double;
char* a_char1;
char* a_char2;
} testStruct;
testStruct make_struct(double d, char* c1, char* c2) {
testStruct t;
t.a_double = d;
t.a_char1 = c1;
t.a_char2 = c2;
return t;
}
void get_struct(testStruct &t) {
char* test_char1 = "test";
char test_char2[] = "test2";
double test_double = 5;
t = make_struct(test_double, test_char1, test_char2);
std::cout << "get_struct: " << t.a_double << " "
<< t.a_char1 << " " << t.a_char2 << std::endl;
}
int main() {
testStruct t;
get_struct(t);
std::cout << "main: " << t.a_double << " "
<< t.a_char1 << " " << t.a_char2 << std::endl;
return 0;
}
您有一个问题,即在结构中存储指向局部变量的指针。
在test_char2
数组的情况下,一旦get_struct
函数返回,它就不再存在。这意味着指针a_char2
不再指向有效字符串,并且取消引用该指针是未定义的行为。
第一个指针之所以有效,是因为它不指向局部变量,而是指向字符串文字,而这些文字存储在内存的其他地方。
在C++中进行编码时,不再需要为字符串使用指针或数组,而是使用std::string
类。
char* test_char1 = "test";
这将创建一个指向字符串文字的指针。字符串文字是const
,但由于历史原因,该语言允许指针是非const
;但是,这是不赞成的,因此发出警告。如果你试图修改字符串,那么你会得到未定义的行为。
char test_char2[] = "test2";
这将创建一个本地数组,通过复制字符串文字进行初始化。它不是const
,所以如果您愿意,可以对其进行修改。但一旦函数返回,它就会被破坏,因此您的结构最终会有一个指向无效内存的悬挂指针。这就是为什么当您尝试在main
中打印它时会得到未定义的行为。
两条建议:
- 不要使用C风格的字符数组和指针来表示字符串;使用CCD_ 9。它为你管理内存,避免你在这里遇到的终身问题
- 如果你真的想处理数组和指针,除非你真的需要修改,否则就使用
const char*
。否则,很难处理字符串文字
当将字符串文字分配给本地char[]
变量时,该存储将在本地分配。
从该范围导出该指针违反了本地变量的(自动)存储持续时间约束,访问指针后面的内存是未定义的行为。
相反,当分配给char*
时,会创建一个指向静态分配的字符串的指针,并且不会复制到本地存储。因此,指针在该范围之外仍然有效。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 将char转换为std::string不起作用
- 将字符串转换为char,当我cout时,它是正确的,但是当我将chdir与char一起使用时,它不起作用
- 为什么INT(char)的比较不起作用
- 如何使const char*函数起作用
- 删除Char指针在destructor中不起作用
- 为什么传递char[]不起作用,而(不推荐使用的转换)char*起作用
- 为什么"const int" "int"转换有效,但"const char[]"到"char *"不起作用
- QString到std::string到const char*的转换在赋值中不起作用
- 为什么从int到char的memcpy不起作用
- 手动设置 char* 的结尾不起作用
- 为什么这个<char>C++ money_put程序不起作用?
- 以双精度数除以双精度数来获得循环中的余数和char参数不起作用
- 通过多个方法传递 char* 最终不起作用
- 为什么我的简单反向char*不起作用