char * s = new char []和char s [20]之间的区别?

时间:2016-06-03 03:02:21

标签: c++

#include<iostream>
#include<process.h>
using namespace std;
template<class T>
class List{
    class Node{
    public:
        T num;
        Node*next;
    }*head,*tail;
public:
    List(){
        head = tail = NULL;
    }
    void insert(T *n){
        Node*tmp=new Node;
        tmp->next = head;
        tmp->num = *n;
        head = tmp;
        if (tail == NULL){
            tail = tmp;
        }
    }
    void append(T*n){
        Node*tmp=new Node;
        tmp->next=NULL;
        tmp->num = *n;
        if (tail == NULL){
            head = tail = tmp;
        }
        else {
            tail->next = tmp;
            tail = tmp;
        }
    }
    T Get(){
        if (head == NULL){
            exit(0);
        }
        else{
            T t = head->num;
            Node*p = head;
            if (head->next == NULL){
                head = tail = NULL;
            }
            else{
                head = head->next;
            }
            delete (p);
            return t;
        }
    }
};
class person{
public:
    char*name=new char[];//problem lies here!
    //char name[20];
    int age;
    float hight;
    person(){}
};
int main(){
    person a;
    List<int>link1;
    List<person>link2;
    for (int i = 0; i < 5; i++){
        cin >> a.name >> a.age >> a.hight;
        link2.insert(&a);
        link1.append(&i);
    }
    for (int i = 0; i < 5; i++){
        a = link2.Get();
        link2.append(&a);
        cout << a.name << " " << link1.Get() << endl;
    }
}

正如代码中的解释所示,当使用char*name=new char[]替换char name[20]时,程序出错了。它不会按预期输出所有名称,但只打印最后一个输入名称5次。那么这两个表达式之间的区别是什么? 非常感谢。

1 个答案:

答案 0 :(得分:0)

new char[]不能在GCC下编译。但是,new char[20]确实如此。

char[20]告诉编译器你需要一个数组中的20个字符。这通常在您的调用堆栈上分配。非常大的分配可能导致堆栈溢出,因此在某些圈子中不鼓励这样做。

如果您使用new,则必须致电delete[] name,否则您将遇到内存泄漏问题。如果您致电delete name,您的代码就会出错,因为该数组不会被删除,只会删除char *