C++新手 关于由char*组成的数组

C++新手求助 关于由char*组成的数组
我的部分代码如下
using std::cin;
int length;
cin >> length;
char**str = new char*[length];
for (int i = 0; i < length; i++)
cin >> str[i];
我想要为一个char*数组动态分配内存,可是在输入这个数组的第一个元素之后程序就会崩溃,是哪里出了问题啊?如果把char*换成string,就没有问题了
------解决思路----------------------
str指向一个被new出来的数组,这个数组里的每个元素都是char *类型的
这里是没问题的
但是你并没有给这个数组里的每个char *用new啊

也就是说,你只是开辟了一个数组,这个数组里的每个元素都是指针,但这每个指针都是悬垂指针、是不知道指向哪儿的....
------解决思路----------------------
new char*[length]  这个相当于new了length个char*,而指针在32位系统都是4个字节,其实就是new了length个4个字节的空间
,这4个字节就是char*的地址,但是这个地址是new出来随机的4个字节的整数,并不是其实有效的地址.
cin >> str[i]; 然后你向无效的地址空间赋值 肯定就报错了
而你换成了 new string[lenggh] 这个相当于new了length个string,而每个string 是有有效空间的,每个string相当于给一个
大char数值,向他赋值肯定没问题
------解决思路----------------------
char**str = new char*[length];
for (int i = 0; i < length; i++) {
    str[i] = new char[100];
    cin >> str[i];
}
------解决思路----------------------
再加个这样的语句str[i] = new char[10];
------解决思路----------------------
我试了一下~~~

#include <iostream>
void main()
{
using std::cin;
int length;
cin >> length;
char**str = new char*[length];
for (int i = 0; i < length; i++)
{
str[i]=new char;//可以多new几个,new char[10]
cin>>str[i];
}

for (int i = 0; i < length; i++)
{
std::cout<<str[i];
}
}



引用:
Quote: 引用:

str指向一个被new出来的数组,这个数组里的每个元素都是char *类型的
这里是没问题的
但是你并没有给这个数组里的每个char *用new啊

也就是说,你只是开辟了一个数组,这个数组里的每个元素都是指针,但这每个指针都是悬垂指针、是不知道指向哪儿的....

我明白了,那怎样才能对这个数组里的每个char*都用new呢?

------解决思路----------------------
引用:
我试了一下~~~

#include <iostream>
void main()
{
using std::cin;
int length;
cin >> length;
char**str = new char*[length];
for (int i = 0; i < length; i++)
{
str[i]=new char;//可以多new几个,new char[10]
cin>>str[i];
}

for (int i = 0; i < length; i++)
{
std::cout<<str[i];
}
}



Quote: 引用:

Quote: 引用:

str指向一个被new出来的数组,这个数组里的每个元素都是char *类型的
这里是没问题的
但是你并没有给这个数组里的每个char *用new啊

也就是说,你只是开辟了一个数组,这个数组里的每个元素都是指针,但这每个指针都是悬垂指针、是不知道指向哪儿的....

我明白了,那怎样才能对这个数组里的每个char*都用new呢?



对啊 就像这样  一个循环遍历挨个new
既然你都用了new和指针的指针  那么更有意义的就是你可以在new之前弄个长度,让用户输入长度,根据这个长度再new  这样以来,每个new出来的数组的长度就不一样了   也就成了锯齿状的字符串数组了
如果像你这里写的new char 或者 new char[10]  这样的话每个数组长度都一样了 那么用二维指针也就没什么意义了