c - 在 c 中将内存动态分配给现有数组之前需要检查的三个条件是什么

标签 c arrays memory memory-management

我的查询是关于 c 编程中的动态内存分配。

我有一个动态分配内存的数组,现在我从我的一位 friend 那里得到一个问题,在将内存重新分配给现有数组之前需要检查 3 个条件。 我尝试进行研发,但没有得到合适的答案。

你能帮我解决这个问题吗?下面是我用于分配内存的代码。

#include <stdio.h>
#include <stdlib.h>
int main(){
int n,i,*ptr,sum=0;
printf("Enter number of elements: ");
scanf("%d",&n);
ptr=(int*)malloc(n*sizeof(int));  //memory allocated using malloc
if(ptr==NULL)                     
{
    printf("Error! memory not allocated.");
    exit(0);
}
printf("Enter elements of array: ");
for(i=0;i<n;++i)
{
    scanf("%d",ptr+i);
    sum+=*(ptr+i);
}
printf("Sum=%d",sum);
free(ptr);
return 0;
}

现在,我想询问用户是否扩展内存,如果是,那么我想重新分配内存。

最佳答案

为了为指针重新分配内存,您需要检查的三件事是:

  1. 是否达到了先前的分配限制;
  2. 新的分配大小大于当前的;和
  3. realloc 的调用返回一个有效的指针。

最后一个信息量最大。如果成功,realloc 返回指向新分配内存的指针,如果失败则返回 NULL。这会对您的现有数据产生严重影响。如果您尝试使用现有指针重新分配但失败,您的指针将设置为NULL并且您的现有数据将丢失。这就是为什么建议将 realloc 的返回分配给一个临时指针,并在将 realloc 的返回分配给现有指针之前测试是否返回了有效指针。

重新分配的一般方法是先分配合理数量的内存。使用内存时,检查是否达到内存限制。当达到 realloc 两倍于当前内存量时到一个临时指针并检查是否返回一个有效指针。如果是这样,请将新指针分配给现有指针并更新用于跟踪当前分配大小的变量。 (必要时重复)

以下结合了上述各项。查看它,如果您有任何问题,请告诉我:

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

#define MAXS 5

int main() {

    int *myarray = NULL;        /* initialize all variables */
    int *tmp = NULL;
    int asize = MAXS;
    int i = 0;

    printf ("\n Filling myarray with 30 elements (allocated 5)\n\n");

    myarray = calloc (MAXS, sizeof *myarray);   /* allocate 5 ints  */
    if (!myarray)
    {
        printf (" error: allocation failed.\n");
        exit (EXIT_FAILURE);
    }

    for (i = 0; i < 30; i++)                    /* fill w/30 ints   */
    {
        if (i == asize)                         /* test if at limit */
        {                                       /* if so realloc    */
            if ((tmp = realloc (myarray, 2 * asize * sizeof *myarray)))
            {
                myarray = tmp;                  /* if OK, reassign  */
                asize = 2 * asize;              /* update asize     */
                printf ("  => reallocated myarray, size : %d\n", asize);
            }
            else                                /* realloc failed   */
            {
                printf (" error: realloc failed.\n");
                break;
            }
        }
        myarray[i] = i;                         /* assign element   */

        printf ("  filled myarray[%2d] : %d\n", i, myarray[i]);
    }

    if (myarray) free (myarray);                /* free memory      */

    printf ("\n");

    return 0;
}

输出:

$ ./bin/reallocint

 Filling myarray with 30 elements (allocated 5)

  filled myarray[ 0] : 0
  filled myarray[ 1] : 1
  filled myarray[ 2] : 2
  filled myarray[ 3] : 3
  filled myarray[ 4] : 4
  => reallocated myarray, size : 10
  filled myarray[ 5] : 5
  filled myarray[ 6] : 6
  filled myarray[ 7] : 7
  filled myarray[ 8] : 8
  filled myarray[ 9] : 9
  => reallocated myarray, size : 20
  filled myarray[10] : 10
  filled myarray[11] : 11
  filled myarray[12] : 12
  filled myarray[13] : 13
  filled myarray[14] : 14
  filled myarray[15] : 15
  filled myarray[16] : 16
  filled myarray[17] : 17
  filled myarray[18] : 18
  filled myarray[19] : 19
  => reallocated myarray, size : 40
  filled myarray[20] : 20
  filled myarray[21] : 21
  filled myarray[22] : 22
  filled myarray[23] : 23
  filled myarray[24] : 24
  filled myarray[25] : 25
  filled myarray[26] : 26
  filled myarray[27] : 27
  filled myarray[28] : 28
  filled myarray[29] : 29

关于c - 在 c 中将内存动态分配给现有数组之前需要检查的三个条件是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27597725/

相关文章:

c - "Expected expression before ' { ' token"

iPhone - dealloc - Release vs. nil

c - 使用 execvp() 在递归 cp 中未扩展通配符

arrays - 如何将数组与 `bash` 中的附加元素连接起来?

java - 如何使用 Java 将数组参数设置为变量

memory - 增加 CUDA 中每个线程寄存器的使用

sql - 将表moSTLy或部分加载到工作内存中以供查询

python - 将 C 方法与 python 脚本连接起来

c - 如何识别long double数据类型的精度

c - 指针算术分段问题