C++ 字符指针(由new分配)及其初始值

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编

我对字符指针有一些疑问:

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编译器不允许

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++范围(卷曲括号)时,内存会自动释放。