这完全取决于您想要达到的目标。我猜它是一个字符串数组,但也许你的片段都不会执行你想要的。所以让我们来看看它们:
char ** str;
str=(char **)malloc(sizeof(char*) * ARRAY_LEN);
str 是指向 char 的指针。这确实可以用于此目的。然后 malloc 为 ARRAY_LEN 个指向 char 的指针正确分配空间,对于预期目的也可以。问题可能在于没有分配实际的字符串,也就是说,所有指向 char 的 ARRAY_LEN 指针都指向天知道在哪里(malloc() 没有初始化它们,甚至没有初始化为 NULL)。正确完成此操作的一种方法是将所有指针设置为 NULL ,指示您的字符串列表为空。
str=(char*)malloc(sizeof(char)* ARRAY_LEN);
for(i=0;i<ARRAY_LEN;i++)
*(str+i)=(char*)malloc(sizeof(char)* ARRAY_LEN);
我假设 str 仍然是指向 char 的指针。然后转换本身将无效,并且仅占用 ARRAY_LEN 字节数(sizeof(char) 评估为 1)用于 ARRAY_LEN 指针数(好吧,一旦您尝试访问所有这些指针就未定义......)。第二部分,如果你想要一个字符的矩形数组,for 循环可以完成第一个场景,但是这种情况下,当循环开始在存储空间不足之外写入时,分配给 *(str+i) 可能会导致段错误分配给str。
char str[ARRAY_LEN][ARRAY_LEN];
这是一个普通的矩形二维字符数组。请注意,它在概念上与上述两者不同!str 不能衰减为与上面的 char ** str 具有相同的含义,因为它是二维的(一维数组可能会根据需要衰减为指针)。
在所有这三种情况下,您似乎都试图获得一个矩形 (ARRAY_LEN * ARRAY_LEN) 字符存储,前两个以双重间接的形式,最后一个作为二维数组。这可能不是您想要做的,可能您更想获得一个字符串数组。如果您事先对字符串一无所知,也不知道它们的最大长度,那么正确执行会更加复杂(您可能希望通过某种方式分别处理所有字符串,具体取决于用例确定它们的长度并分配因此 - 可能甚至需要编码动态增长的存储)。否则,如果您知道或可以限制最大长度(注意终止零),您可以相应地分配,然后在读入时限制字符串长度。
希望能帮助到你。