Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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_Linux_Malloc - Fatal编程技术网

C 为什么分配大量字符*时内存大小会加倍?

C 为什么分配大量字符*时内存大小会加倍?,c,linux,malloc,C,Linux,Malloc,我分配了一个2D数组char*,每个字符串长度为12。 50行和2000000列 让我们计算一下: 50*2000000*(12(长度)+8(指针))。我使用64位 50*2000000*20=2000000000位..->2GB 当我检查内存监视器时,它显示该进程需要4 GB。 (分配后发生的一切) 代码如下: int col=2000000,row=50,i=0,j=0; char *** arr; arr=(char***)malloc(sizeof(char**)*row); for(i

我分配了一个2D数组
char*
,每个字符串长度为12。
50行和2000000列

让我们计算一下:
50*2000000*(12(长度)+8(指针))
。我使用64位

50*2000000*20=2000000000位..->2GB

当我检查内存监视器时,它显示该进程需要4 GB。
(分配后发生的一切)

代码如下:

int col=2000000,row=50,i=0,j=0;
char *** arr;
arr=(char***)malloc(sizeof(char**)*row);
for(i=0;i<row;i++)
{
arr[i]=(char ** )malloc(sizeof(char*)*col);
    for(j=0;j<col;j++)
     {
         arr[i][j]=(char*)malloc(12);
         strcpy(arr[i][j],"12345678901");
         arr[i][j][11]='\0';
     }
}
int col=2000000,row=50,i=0,j=0;
字符***arr;
arr=(char***)malloc(sizeof(char**)*行);

对于(i=0;imalloc的每次调用占用的内存比您要求的要多。malloc需要将其内部有关分配位置的信息存储在某个位置,如分配空间的大小、有关邻居块的一些信息等。此外(很可能)每个返回的指针都与16个字节对齐。据我估计,每个12字节的分配占用32个字节的内存。如果要保存内存,请在一个malloc中分配所有字符串,并将它们按每12个字节的大小进行拆分。 请尝试以下操作:

int col=2000000,row=50,i=0,j=0;
char *** arr;
arr= malloc(sizeof(*arr)*row);
for(i=0;i<row;i++)
{ 
  arr[i]= malloc(sizeof(*arr[i])*col);
  char *colmem = malloc(12 * col);
  for(j=0;j<col;j++)
  {
     arr[i][j] = colmem + j*12;
     strcpy(arr[i][j],"12345678901");
  }
}
int col=2000000,row=50,i=0,j=0;
字符***arr;
arr=malloc(sizeof(*arr)*行);

对于(i=0;imalloc的每次调用占用的内存比您要求的要多。malloc需要将其内部有关分配位置的信息存储在某个位置,如分配空间的大小、有关邻居块的一些信息等。此外(很可能)每个返回的指针都与16个字节对齐。据我估计,每个12字节的分配占用32个字节的内存。如果要保存内存,请在一个malloc中分配所有字符串,并将它们按每12个字节的大小进行拆分。 请尝试以下操作:

int col=2000000,row=50,i=0,j=0;
char *** arr;
arr= malloc(sizeof(*arr)*row);
for(i=0;i<row;i++)
{ 
  arr[i]= malloc(sizeof(*arr[i])*col);
  char *colmem = malloc(12 * col);
  for(j=0;j<col;j++)
  {
     arr[i][j] = colmem + j*12;
     strcpy(arr[i][j],"12345678901");
  }
}
int col=2000000,row=50,i=0,j=0;
字符***arr;
arr=malloc(sizeof(*arr)*行);

对于(i=0;i我会从头开始重新编写代码。出于某种原因,大约99%的C程序员不知道如何正确地动态分配真正的2D数组。我甚至不确定自己是否是其中的一员,但让我们试一试:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main()
{
  const int COL_N = 2000000;
  const int ROW_N = 50;

  char (*arr)[ROW_N] = malloc( sizeof(char[COL_N][ROW_N]) );

  if(arr == NULL)
  {
    printf("Out of memory");
    return 0;
  }

  for(int row=0; row<ROW_N; row++)
  {
    strcpy(arr[row], "12345678901");
    puts(arr[row]);
  }

  free(arr);

  return 0;
}
#包括
#包括
#包括
int main()
{
const int COL_N=2000000;
第行常数=50;
char(*arr)[ROW_N]=malloc(sizeof(char[colu N][ROW_N]);
如果(arr==NULL)
{
printf(“内存不足”);
返回0;
}

对于(int row=0;row,我会从头开始重新编写代码。出于某种原因,大约99%的C程序员不知道如何正确地动态分配真正的2D数组。我甚至不确定我是其中的一员,但让我们试一试:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main()
{
  const int COL_N = 2000000;
  const int ROW_N = 50;

  char (*arr)[ROW_N] = malloc( sizeof(char[COL_N][ROW_N]) );

  if(arr == NULL)
  {
    printf("Out of memory");
    return 0;
  }

  for(int row=0; row<ROW_N; row++)
  {
    strcpy(arr[row], "12345678901");
    puts(arr[row]);
  }

  free(arr);

  return 0;
}
#包括
#包括
#包括
int main()
{
const int COL_N=2000000;
第行常数=50;
char(*arr)[ROW_N]=malloc(sizeof(char[colu N][ROW_N]);
如果(arr==NULL)
{
printf(“内存不足”);
返回0;
}


对于(int row=0;row什么是“内存导师”?我真诚地希望
z
应该是
j
,否则这不会做你(显然)想要它做的事。(而且反正也不需要它;
strcpy
会帮你解决这个问题。)
arr[I][z][11]='\0';
?除非你有一个坚如磐石的子分配器(而且你没有),通过12-
char
s的10000000次分配,您将获得比每个12-
char
s多得多的内存。而您的堆链将因为管理这件事的链分配而彻底崩溃。“内存导师”是什么?我真诚地希望
z
应该是
j
,否则这不会做你(显然)想要做的事。(而且反正也不需要;
strcpy
会帮你解决这个问题。)
arr[I][z][11]='\0';
?除非你有一个坚如磐石的子分配器(而且你没有),每个12-
char
s的10000000次分配比每个12-
char
s的分配获得了更多的内存。而你的堆链将被管理这件事的链式分配彻底摧毁。编辑:Sry。太晚了。我以为你一下子就分配了整个东西。你是对的。-1,这是s是一个可怕的、多余的黑客,它甚至不做广告上所宣传的事情(“在一个malloc中分配所有字符串,并将它们按每12个大小进行拆分”,这是Lundin下面的回答,但不是这段代码)@H2CO3问题是为什么原始代码占用的内存比mallocs要求的要多。我已经正确地回答了,并建议使用一个实验代码来演示我的答案。你为什么反对正确的答案?@Marian建议使用错误的做法并不能作为其他正确解释的理由。@H2CO3我建议了什么错误的做法?我是我对原来的代码做了一点小小的修改,演示了分配许多小块和分配较大的小块之间的区别。编辑:Sry。太晚了。我以为你一下子就分配了整个东西。你是对的。-1,这是一个可怕的、多余的黑客行为,它甚至没有做广告上说的(“将所有字符串分配到一个malloc中,并根据自己的喜好将它们拆分为每12个大小”,这是Lundin下面的回答,但不是这段代码)@H2CO3问题是为什么原始代码占用的内存比mallocs要求的要多。我已经正确地回答了,并建议使用一个实验代码来演示我的答案。你为什么反对正确的答案?@Marian建议使用错误的做法并不能作为其他正确解释的理由。@H2CO3我建议了什么错误的做法?我是VC++对原始代码做了最小的修改,演示了许多小块的分配与大的分配之间的区别。Caland和Re..不是const…编译器没有返回返回值就给出了错误。谢谢。编译器?这是一种不同的编程语言,它与C不完全兼容。@IbrahimAsad如果列和列不是常量,也可以(C有可变长度数组),并且不能强制转换
malloc
的返回值,因为这是有害的(请阅读我链接的答案).这些错误是您试图