C++ 为什么在构造函数中将字符串赋值给指针是安全的?

C++ 为什么在构造函数中将字符串赋值给指针是安全的?,c++,constructor,C++,Constructor,我有一门课: h .cpp 和main.cpp #include<iostream> void InAFunc(test *kio) { int foo[3] = { 1,2,3 }; *kio = test(7, "Hello!", foo); } int main() { test mmk; InAFunc(&mmk); std::cout << mmk.Name << mmk.ARR[1]; } #包括

我有一门课: h

.cpp

和main.cpp

#include<iostream>
void InAFunc(test *kio) {
    int foo[3] = { 1,2,3 };
    *kio = test(7, "Hello!", foo);
}
int main() {
    test mmk;
    InAFunc(&mmk);
    std::cout << mmk.Name << mmk.ARR[1];
}
#包括
无效InAFunc(测试*kio){
int-foo[3]={1,2,3};
*kio=test(7,“你好!”,foo);
}
int main(){
测试mmk;
InAFunc(和mmk);
标准::cout
为什么在构造函数中保留一个字符串而不使用new或malloc是可以的?
为什么在构造函数中将字符串赋值给指针是安全的

<>在C++中,所有的<强>都是对象< /强>:

  • int
    是一个对象
  • 字符串文字是一个对象
  • 指针也是可以指定的对象

因此,指针
Name
指向字符串文本所在的位置。

字符串“Hello”是一个
字符串文本
,在整个程序期间都存在。因此,您可以始终指向它而不中断指针。它不会在函数结束时被销毁。

哦,我不知道问题出在哪里。 常量字符串文字位于由编译器管理的区域(只读部分)中, 它将是免费的,直到程序停止。 "

“hello”的类型是char*(实际上是char[6]),而不是字符串。char*可以用作字符串,因为隐式转换,std::string有一个接受char*作为参数的构造函数。


顺便说一句,“kio=test(…)”无法编译。

您的代码有未定义的行为(这意味着无法保证崩溃!),但不是因为您认为它有这样的原因

InAFunc()


main()
中的
mmk
变量是默认构造的,因此推测
mmk.Name
mmk.ARR
为NULL(不过,您没有显示该构造函数的代码)和
InAFunc()
不会覆盖该值。将NULL
char*
指针传递到
运算符是未定义的行为。字符串“Hello”是一个字符串文字,在整个程序期间都存在。类似:阅读有关程序段,尤其是数据段的内容,您将了解“Hello!”的位置顺便说一句,这个小例子中有很多错误
kio=test(7,“Hello!”,foo)
--这里,
kio
是一个指针。它不会编译,这告诉我显示的代码不是实际的代码。因此,对这个问题的任何回答都将毫无意义,因为它们不会基于您正在使用的真实代码。请发布实际编译的代码,并展示您正在描述的行为。代码u posted有很多很多错误,无法编译。实际上它是
常量字符[6]
(在本例中是7,因为字符串是“Hello!”7,这是由于空字符。
test::test(int l, char* n, int* a){
    Length=l;
    Name=n;
    ARR=a;
}
#include<iostream>
void InAFunc(test *kio) {
    int foo[3] = { 1,2,3 };
    *kio = test(7, "Hello!", foo);
}
int main() {
    test mmk;
    InAFunc(&mmk);
    std::cout << mmk.Name << mmk.ARR[1];
}
void InAFunc(test &kio)