malloc **和*之间有区别吗?

时间:2013-07-01 18:30:11

标签: c string malloc

我想知道这样做是否有区别

char ** str;
str=(char **)malloc(sizeof(char*) * ARRAY_LEN);

并且这样做:

str=(char*)malloc(sizeof(char)* ARRAY_LEN);
for(i=0;i<ARRAY_LEN;i++)
*(str+i)=(char*)malloc(sizeof(char)* ARRAY_LEN);

这样做也是一样的:

char str[ARRAY_LEN][ARRAY_LEN];

2 个答案:

答案 0 :(得分:2)

是的,一个是指向char的指针,另一个是指向char的指针,有一个很大的区别。之间。您可以将其视为第一种情况下的字符串数组,以及第二种情况下的单个字符串。

当然,在第一种情况下,你必须以某种方式为“数组”中的实际字符串分配内存。

答案 1 :(得分:2)

这完全取决于你想要达到的目标。我猜这是一个字符串数组,但也许你的片段都不会执行你想要的。让我们回顾一下:

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)evaulates为1)ARRAY_LEN指针数量(嗯,一旦你尝试访问所有那些就未定义......)。如果你想要一个矩形的字符数组,第二部分,for循环可以完成第一个场景,但是这种情况下,当循环开始在不足的存储空间外写时,*(str + i)的赋值可能会导致段错误分配给str。

char str[ARRAY_LEN][ARRAY_LEN];

这是一个简单的矩形二维chars数组。请注意,它在概念上与上述两者不同! str不能衰减到上面的char ** str具有相同的含义,因为它是2维(一维数组可能根据需要衰减到指针)。

在所有三种情况下,似乎你试图得到一个矩形(ARRAY_LEN * ARRAY_LEN)字符存储,在前两个中以双间接的形式,在最后作为二维数组。这可能不是你想要做的,可能你更想得到一个字符串数组。如果您事先对字符串一无所知,也不知道它们的最大长度,那么执行起来会更复杂(您可能希望单独处理所有字符串,通过某种方式根据用例计算出它们的长度,并分配相应 - 甚至可能需要编码动态增长的存储。否则,如果您知道或可以限制最大长度(注意终止零),您可以相应地进行分配,然后在读取时限制字符串长度。

希望它有所帮助。