使用int数组分配动态内存

时间:2013-12-18 06:49:48

标签: c memory-management malloc free realloc

我有一项作业,我必须接受用户的输入。我不能使用链表,只能使用数组,所以我的计划是:

  1. 分配一些记忆。

  2. 如果我们需要重新分配,意味着我达到了分配的单元格数量:

    1. 尝试重新分配。如果成功,那很好。

    2. 如果我们无法重新分配,请打印输入,空闲内存和realloc。

  3. 我无法真正决定告诉我如何达到内存分配的命令,这就是我需要你帮助的原因。我写道:

    if (i==(MAX_CHARS_INPUT-1))
    

    但我不确定。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_CHARS_INPUT 200
    #define D_SIZE 2
    
    void printWithMalloc(){
        int charSize=1; 
        int *ptr=malloc(MAX_CHARS_INPUT*sizeof(charSize));
    
        int i=0, j=0, c;
        printf("please enter a string\n");
    
        while ((c=getchar())!=EOF && c!='\n')
        {
            ptr[i++]=c;
            if (i==(MAX_CHARS_INPUT-1)) /*if we need to realloc*/
            {
                int *temp=realloc(ptr,D_SIZE*MAX_CHARS_INPUT*sizeof(charSize));
                if (temp==NULL) /*realloc failed*/
                {
                    printf("you wrote:\n");
                    while(j<=i)
                        putchar(ptr[j++]);
    
                    free(ptr);
                    ptr=(int*)malloc(MAX_CHARS_INPUT*sizeof(charSize));
                }
                else
                    ptr=temp;
            }
        }
    }
    
    int main(){
        printWithMalloc();
        return 0;
    }
    

    谢谢!

2 个答案:

答案 0 :(得分:1)

问题确实与你的情况有关:

if (i==(MAX_CHARS_INPUT-1))

这样可行,但只有在您第一次达到此限制时才有效。当realloc缓冲区变大时,您不会检查那个空间是否已用完。所以我想输入500个字符。读取第199个字符时,缓冲区重新分配为400个字符。但是,i仅在第199个字符处 检查,因此当到达第400个字符时,它将用完缓冲区。

第二个问题是当你重新分配缓冲区时,它只会增长到400个字符(D_SIZE * MAX_CHARS_INPUT)并且不会更大。

第三个问题是当你重新malloc时(即当realloc失败时)你没有重置i所以它会立即写入缓冲区的末尾。

正如现在删除的答案所示。跟踪缓冲区大小:

size_t buffSize = MAX_CHARS_INPUT;

重新分配时,首先更新buffSize,然后将其用作realloc的参数:

buffSize *= D_SIZE; // double the buffer-size
temp = realloc(ptr, buffSize * sizeof(*temp)); // using sizeof *temp is less confusing and less error-prone

当然:还要更新你的病情:

if(i == buffSize - 1)

当您重新malloc重置ibuffSize时:

buffSize = MAX_CHARS_INPUT;
ptr = malloc(buffSize*sizeof(*ptr));
i = 0;

虽然重新malloc不是很明智,但是如果分配失败,通常会有更大的问题(除非内存非常有限)。而且(特别是因为你没有检查malloc的结果)可能有问题,因为malloc也可能失败。在alloc-fail之后退出程序并不罕见。

答案 1 :(得分:0)

您的代码中出现了一些错误,新代码是:

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

  #define MAX_CHARS_INPUT 200
  #define D_SIZE 2

  void printWithMalloc(){
      //int charSize=1; you don't need this.
      //int *ptr=malloc(MAX_CHARS_INPUT*sizeof(charSize));
      char *ptr=malloc(MAX_CHARS_INPUT*sizeof(char));//sizeof(char) will give you the block size, MAX_CHARS_INPUT: gives you the number of blocks to be allocated and pointer type is char, since you want to save char(s), right?

      int i=0, j=0, c;
      printf("please enter a string\n");

      //while ((c=getchar())!=EOF && c!='\n')
       while ((c=getchar())!='\r') //'\r' is for enter key... since the user input is coming from console not form a file, right?
      {
          ptr[i++]=c;
          if (i==(MAX_CHARS_INPUT-1)) /*if we need to realloc*/
          if (i==MAX_CHARS_INPUT) // i is already incremented in i++
          {
              //int *temp=realloc(ptr,D_SIZE*MAX_CHARS_INPUT*sizeof(charSize));
              char *temp=realloc(ptr,D_SIZE*MAX_CHARS_INPUT*sizeof(char));
              if (temp==NULL) /*realloc failed*/
              {
                  printf("you wrote:\n");
                  while(j<=i)
                      putchar(ptr[j++]);

                  free(ptr);
                  ptr=(char*)malloc(MAX_CHARS_INPUT*sizeof(char));
              }
              else
                  ptr=temp;
          }
      }
  }

  int main(){
      printWithMalloc();
      return 0;
  }