char ** r; r =(char **)malloc(10);
上面的分配是否足够?我不需要通过for循环分配char * r吗?任何可以解释哪一个是对的?
答案 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,但同样,我更喜欢上面的形式,因为它是与类型无关的。