我的查询是关于 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;
}
现在,我想询问用户是否扩展内存,如果是,那么我想重新分配内存。
最佳答案
为了为指针重新分配内存,您需要检查的三件事是:
- 是否达到了先前的分配限制;
- 新的分配大小大于当前的;和
- 对
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/