双点内存分配

时间:2010-07-15 04:18:10

标签: c pointers

char ** r;     r =(char **)malloc(10);

上面的分配是否足够?我不需要通过for循环分配char * r吗?任何可以解释哪一个是对的?

4 个答案:

答案 0 :(得分:5)

这肯定是错的。 char*的大小在大多数架构上都不会划分为10。

以下是一些示例代码:

char** r;
// Allocate an array of 10 char* in r
r = (char**)malloc(10 * sizeof(*r));

现在r的每个元素都是一个已分配的char*,可用于指向某处。

另请注意,在上面的代码中,我(正如你所做)演员malloc的结果。只有在使用C ++编译器而不是不需要强制转换的C编译器编译此代码时,才需要这样做。 OTOH,在C ++中你需要new,而不是malloc

答案 1 :(得分:4)

假设您要分配10个char指针,这将无效。相反,您将为10个字节分配内存。

char指针可能超过一个字节。希望您的编译器知道它的实际大小。

char** r = (char**)malloc(sizeof (char*) * 10);

这为10个char指针分配了足够的空间。但是,目前,它们没有任何用处。你也需要为它们分配内存:

int sizeOfMyStrings = 20;
for (int i = 0; i < 10; i++)
    r[i] = (char*)malloc(sizeoOfMyStrings);

这会给你10个char指针,每个指针指向20个字节的已分配内存。

(此处不涉及sizeof因为它是sizeof(char)sizeof(char)定义为1.)

答案 2 :(得分:0)

char ** r是指向char指针的指针。它可以看作是一个字符串数组。如果要初始化阵列的所有内存,则需要执行

r = (char **)malloc(sizeof(char *) * NUMBER_OF_ELEMENTS_OF_ARRAY);
for (i = 0; i < NUMBER_OF_ELEMENTS_OF_ARRAY; i++) {
    r[i] = (char *)malloc(sizeof(char) * LENGTH_YOU_WANT_STRING);
}

或类似的东西。

答案 3 :(得分:0)

以您想要的方式为“二维”结构分配内存的简单方法是:

#include <stdlib.h> /* for malloc() */

char **r;
/* we will allocate 'size' values, each of 'data_size' length */
size_t size = 10;
size_t data_size = 42;
size_t i;

/* allocate 'size' objects of the right type.
 *
 * Notes:
 *
 * 1. no casting the return value of malloc(),
 * 2. r = malloc(size * sizeof *r) is type-agnostic, so
      if you change the type of r, you don't need to remember
      to change the malloc() call */

r = malloc(size * sizeof *r);

/* Error check omitted for clarity.  In real code, always check for return
   value of malloc() */

for (i=0; i < size; ++i) {
    /* once again, no cast, and we use x = malloc(size * sizeof *x) idiom */
    r[i] = malloc(data_size * sizeof *r[i]);
}

上述方案的优点是,它可以在3维,4维或更高维度上轻松工作,并且更易于阅读。

在上面的代码中,在循环中,我可以写malloc(data_size)而不是malloc(data_size * sizeof *r[i]),因为sizeof(char)保证为1,但同样,我更喜欢上面的形式,因为它是与类型无关的。