Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 双点内存分配_C_Pointers - Fatal编程技术网

C 双点内存分配

C 双点内存分配,c,pointers,C,Pointers,字符**r; r=字符**malloc10 上面的分配就足够了?我不需要通过for循环为char*r分配吗?任何人都可以解释哪一个是正确的?这肯定是错误的。在大多数架构中,字符*的大小不会除以10 下面是一些示例代码: char** r; // Allocate an array of 10 char* in r r = (char**)malloc(10 * sizeof(*r)); 现在,r的每个元素都是一个分配的字符*,可以用来指向某个地方 还要注意,在上面的代码中,我像您一样强制转换m

字符**r; r=字符**malloc10


上面的分配就足够了?我不需要通过for循环为char*r分配吗?任何人都可以解释哪一个是正确的?

这肯定是错误的。在大多数架构中,字符*的大小不会除以10

下面是一些示例代码:

char** r;
// Allocate an array of 10 char* in r
r = (char**)malloc(10 * sizeof(*r));
现在,r的每个元素都是一个分配的字符*,可以用来指向某个地方


还要注意,在上面的代码中,我像您一样强制转换malloc的结果。只有当这个代码是用C++编译器编译的,而不是一个不需要强制转换的C编译器时,这才是必要的。OTHH,C++中需要新的,不是Malc。< /P> < P>这肯定是错误的。在大多数架构中,字符*的大小不会除以10

下面是一些示例代码:

char** r;
// Allocate an array of 10 char* in r
r = (char**)malloc(10 * sizeof(*r));
现在,r的每个元素都是一个分配的字符*,可以用来指向某个地方


还要注意,在上面的代码中,我像您一样强制转换malloc的结果。只有当这个代码是用C++编译器编译的,而不是一个不需要强制转换的C编译器时,这才是必要的。OTHH,在C++中,你需要新的,而不是Malc。< /P> < P>假设你要分配10个字符指针,这将不起作用。而是为10个字节分配内存

字符指针可能不止一个字节。希望您的编译器知道它的实际大小

char** r = (char**)malloc(sizeof (char*) * 10);
这为10个字符指针分配了足够的空间。然而,目前,它们毫无用处。您还需要为它们分配内存:

int sizeOfMyStrings = 20;
for (int i = 0; i < 10; i++)
    r[i] = (char*)malloc(sizeoOfMyStrings);
这将为您提供10个字符指针,每个指针指向20字节的分配内存


这里不涉及sizeof,因为它将是sizeofchar,并且sizeofchar定义为1。

假设您要分配10个字符指针,这将不起作用。而是为10个字节分配内存

字符指针可能不止一个字节。希望您的编译器知道它的实际大小

char** r = (char**)malloc(sizeof (char*) * 10);
这为10个字符指针分配了足够的空间。然而,目前,它们毫无用处。您还需要为它们分配内存:

int sizeOfMyStrings = 20;
for (int i = 0; i < 10; i++)
    r[i] = (char*)malloc(sizeoOfMyStrings);
这将为您提供10个字符指针,每个指针指向20字节的分配内存


这里不涉及sizeof,因为它将是sizeofchar,并且sizeofchar定义为1。

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

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);
}

或者类似的东西。

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

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);
}

或者类似的东西。

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

#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维或更高维,它只需最少的工作,而且更易于阅读


在上面的代码中,在循环中,我可以编写mallocdata_size而不是mallocdata_size*sizeof*r[I],因为sizeofchar保证为1,但我还是更喜欢上面的形式,因为它是类型不可知的。

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

#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维或更高维,它只需最少的工作,而且更易于阅读


在上面的代码中,在循环中,我可以编写mallocdata_size而不是mallocdata_size*sizeof*r[I],因为sizeofchar保证为1,但我还是更喜欢上面的表单,因为它是类型不可知的。

上面的分配足够做什么?这几乎肯定是不正确的,除非您使用的是一个具有两个或五个字节指针的不同寻常的系统。。。。你可以查阅你的C语言书。如果你没有C语言书,我建议你买一本;你可以在上面找到一份好书的清单,分配什么就够了?这几乎肯定是不正确的,除非您使用的是一个具有两个或五个字节指针的不同寻常的系统。。。。你可以查阅你的C语言书。如果你没有C语言书,我建议你买一本;你可以在小点找到一个好书的列表:C最好不要把Malc的结果投射到C++中,但是在C中它不需要,应该省略,以免掩盖其他有用的编译器警告。更好的样式是ch**r= MalCuthsiZOF*R* 10;小点:在C中最好不要抛出Maloc的结果,你必须在C++中这样做,但是在C中它是不需要的,应该省略,以免掩盖其他有用的编译器警告。更好的样式是ch**r= MalCuthsieOff*R* 10;