在C中增加数组而不使用realloc?

kla*_*mse 1 c malloc memory-management segmentation-fault

所以我想一次从stdin读一个字节。while循环的每次迭代都试图重新分配缓冲区,但是我不想使用realloc。这是我尝试过的:

   char tempChar = '\0';
   char *buffer;
   int bufferSize = 0;


   buffer = (char*) malloc(sizeof(char));
   while((tempChar = getc(stdin)) != EOF)
   {
      buffer[bufferSize] = tempChar;
      bufferSize++;

      char *temp = buffer;
      buffer = (char*)malloc(sizeof(char)*bufferSize);
      memcpy(buffer, temp, sizeof(temp));
      free(temp);
   }
   buffer[bufferSize] = '\0';
Run Code Online (Sandbox Code Playgroud)

我遇到了细分错误。知道为什么会这样吗?

编辑:好的,就像其他人所说的,我修复了两个错误。这是固定版本:

  char tempChar = '\0';
  char *buffer;
  int bufferSize = 1;
  int count = 0; 
  buffer = malloc(sizeof(char));

  while((tempChar = getc(stdin)) != EOF){
    buffer[count] = tempChar;
    count++;

    if(count >= bufferSize){
      bufferSize *= 2;
      char *temp = buffer;
      buffer = malloc(sizeof(char)*bufferSize);
      memcpy(buffer, temp, count);
      free(temp); 
    }
  }

  buffer[count - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)

And*_*nle 5

您的缓冲区太小了一个字节。这条线

  buffer = (char*)malloc(sizeof(char)*bufferSize);
Run Code Online (Sandbox Code Playgroud)

应该读

  buffer = malloc(bufferSize + 1);
Run Code Online (Sandbox Code Playgroud)

请勿malloc()在C中强制使用返回值,并且sizeof(char)按定义是一个返回值。

另外,这是错误的:

  memcpy(buffer, temp, sizeof(temp));
Run Code Online (Sandbox Code Playgroud)

那会复制等于a大小的字节数char *

  • @hexturtle如果用C编写代码,则不是在编程硬件,而是在用C标准指定的抽象机。而且该标准对于`sizeof(char)`非常精确。编译器的工作是将抽象机的程序转换为真正的硬件可以执行并且仍然完全符合标准要求的二进制程序。如果不是,则您的C实现被破坏。该问题被标记为“ C”,因此我们可以假设符合C的实现。 (4认同)
  • @hexturtle不,`sizeof(char)== 1`。总是。也在您的假设机器上。如果您的char是五个八位字节,而int是十个八位字节,则sizeof(char)== 1和sizeof(int)== 2。 (3认同)
  • @hexturtle按照C标准(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf)** 6.5.3.4 sizeof运算符**:“当应用于操作数时类型为“ char”,“ unsigned char”或“ signed char”(或其限定版本)的结果为1。” (2认同)