为什么动态分配内存后数组的长度永远是3 ?

为什么动态分配内存后数组的长度永远是3?
int m, p, i, flag = 0;
char* a = new char[100];
char* b = new char[100];
while (1) {
    cout << endl << "请输入集合1:" << endl;
    cin >> a;
    int length1 = sizeof(a) - 1;
    cout << length1;
    //char* a1 = new char[length1];
    for (i = 0; i < length1; i++) {
        //a1[i] = a[i];
        if (a[i] >= 'a' && a[i] <= 'z')
            cout << a[i];
            sa.insert(a[i]); //插入元素到集合sa  
            
    }
    delete[] a;
    a = NULL;

img

我想要完整得将char字符全部insert到set里面

这里sizeof(a)实际上得到的是char*指针本身所占的内存空间大小,而不是数组的长度。可以改用strlen()来求字符串长度。

char* a = new char[100]; 这种定义及内存申请方式,表明a是一个char*(字符指针),而指针长度通常为4byte,a指向一个动态申请的长度为100的字符数组。

因此,你用sizeof(a) 得到的值总会是4。

如果要求字符串长度,可以用strlen(a),需要字符串a以'\0'结尾。

或者,如果想用一个类(模板)封装起来,可以用std::string a。cin >> a以后,可以通过a.size()得到字符串长度,字符串无需以'\0'结尾。