C++ 字符指针(由new分配)及其初始值
我对字符指针有一些疑问: 1.当我们撰写声明时:C++ 字符指针(由new分配)及其初始值,c++,visual-c++,pointers,new-operator,C++,Visual C++,Pointers,New Operator,我对字符指针有一些疑问: 1.当我们撰写声明时: char *t; 我们需要做什么 t=new char[6]; strcpy(t,"terry"); 或者直接 t="terry"; 行 2.如果我们遵循 char *t; t=new char[6]; t="terry"; 现在将不会指向堆中分配的内存或terry的第一个字母(如果我们从指针操作的角度来看) 3.如果我写: char *t; 然后我必须将“t”初始化为“\0”(但t应该指向分配的内存空间)…因为我的mvc 2010编
char *t;
我们需要做什么
t=new char[6];
strcpy(t,"terry");
或者直接
t="terry";
行
2.如果我们遵循
char *t;
t=new char[6];
t="terry";
现在将不会指向堆中分配的内存或terry的第一个字母(如果我们从指针操作的角度来看)
3.如果我写:
char *t;
然后我必须将“t”初始化为“\0”(但t应该指向分配的内存空间)…因为我的mvc 2010编译器不允许
t=new char[5](0);//0 is the ascii value of '\0'
<>你被标记为C++。使用字符串:
std::string t(“特里”)代码>并让语言为您处理细节
这两种方法都可以,取决于您的需要。如果以后需要更改字符串,则必须分配内存,并且在分配内存时,请始终记住以后删除它
文本的第一个字母
t=新字符[5];t[0]=0代码>
<>你被标记为C++。使用字符串:
std::string t(“特里”)代码>并让语言为您处理细节
这两种方法都可以,取决于您的需要。如果以后需要更改字符串,则必须分配内存,并且在分配内存时,请始终记住以后删除它
文本的第一个字母
t=新字符[5];t[0]=0代码>
您可以使用后一种方法,但指针很可能指向只读内存区域,因此您只能使用const char*
来执行此操作
在本例中,t最终将指向一个只读内存区域,泄漏这6个字节
您可以使用memset()
函数将整个数组设置为0
但是,可以使用std::string
,不要再考虑这个问题了
您可以使用后一种方法,但指针很可能指向只读内存区域,因此您只能使用const char*
来执行此操作
在本例中,t最终将指向一个只读内存区域,泄漏这6个字节
您可以使用memset()
函数将整个数组设置为0
但是,可以使用std::string
,不要再考虑这个问题了
您不应该执行第二个操作,因为t
是char*
,因此t=“terry”
已被弃用(并且您的编译器可能会发出此警告,指示赋值语句)
分配的内存泄漏,因为您没有使用它,t
指向terry
。同样,这是不推荐的(您的编译器可能会给出此警告,指示赋值语句)
只要做:t=newchar[5]()代码>它现在是默认初始化的
作为最佳实践,通常是,std::string
。所以使用它:
std::string t = "terry";
没有内存泄漏,没有不推荐的功能,没有警告。没有紧张
您不应该执行第二个操作,因为t
是char*
,因此t=“terry”
已被弃用(并且您的编译器可能会发出此警告,指示赋值语句)
分配的内存泄漏,因为您没有使用它,t
指向terry
。同样,这是不推荐的(您的编译器可能会给出此警告,指示赋值语句)
只要做:t=newchar[5]()代码>它现在是默认初始化的
作为最佳实践,通常是,std::string
。所以使用它:
std::string t = "terry";
没有内存泄漏,没有不推荐的功能,没有警告。没有紧张 1.如果字符串(例如“terry”)在程序中的任何地方都不会被更改,您当然可以这样做
char* t = "terry";
忘记为字符串分配的内存,因为它将自行释放。但是,更好的常量字符串编程实践是将t
声明为const char*
,如下所示:
const char* t = "terry";
但是如果它要改变,那么它要么
char* t = new char[6];
strcpy(t, "terry");
或
在第一种情况下,如果使用了new
运算符,则在不再需要字符串后,必须释放分配给new
的内存:
delete[] t;
第二种情况下,当代码> > t>代码>离开声明的C++范围(卷曲括号)时(如果<代码> t>代码>是对象的成员,只有当对象被破坏时,内存才会释放),则自动释放STATE内存。
2.之后
char* t;
t = new char[6];
t = "terry";
t
确实指向“terry”,但释放分配给new
的内存所需的指针/地址将永久丢失
3.字符串空终止符('\0')与其他字符一样:它们需要驻留在内存中的某个位置。您非常明智地为“terry”分配了6个字节,长度为5个字符:after
char* t = new char[6];
strcpy(t, "terry");
t
指向的内存块的第6个字节包含空终止符。但是
char* t;
除了t
指针外,不分配任何内存。因此,如果希望字符串仅包含空终止符(长度为零),可以通过以下方式执行:
char* t = new char[1];
t[0] = '\0';
1。如果字符串(例如“terry”)在程序中的任何地方都不会被更改,您当然可以这样做
char* t = "terry";
忘记为字符串分配的内存,因为它将自行释放。但是,更好的常量字符串编程实践是将t
声明为const char*
,如下所示:
const char* t = "terry";
但是如果它要改变,那么它要么
char* t = new char[6];
strcpy(t, "terry");
或
在第一种情况下,如果使用了new
运算符,则在不再需要字符串后,必须释放分配给new
的内存:
delete[] t;
第二种情况,当代码> t>代码> C++中声明的C++范围(卷曲括号)时,内存会自动释放。