正式的 malloc 稍后使用 realloc
Formal malloc to use realloc later
下面的代码只是一个示例,我稍后会用它来说明这一点:
/* Extract digits from an integer and store in an array in reverse order*/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int oct=316;
int* array=malloc(0*sizeof(int*)); //Step 1
int* temp;
size_t size=0;
while(oct/10>0 || oct%10>0){
temp=realloc(array,++size*sizeof(int)); // Step2 requires Step1
if(temp==NULL){
printf("Can't reallocate memory");
exit(-1);
}
else{
array=temp;
}
array[size-1]=oct%10;
oct/=10;
}
for(int i=0;i<size;i++)
printf("%d\n",array[i]);
return 0;
}
realloc 参考 [1] 指出:
Reallocates the given area of memory. It must be previously allocated
by malloc(), calloc(), realloc()...
最初我在没有第 1 步的情况下编译了代码,然后 运行 它出现了分段错误。然后我包含了第 1 步,现在代码可以正常编译了。我不想在没有找到要存储的整数的情况下分配一些 space,所以我使用 zero 的大小和 malloc。然而 malloc 参考 [2] 指出:
If size is zero, the return value depends on the particular library
implementation (it may or may not be a null pointer), but the returned
pointer shall not be dereferenced.
现在,我怀疑我的实现是否可移植。我该如何解决这个问题?
我试过 int* array=NULL;
但出现分段错误。
可以发起array
为NULL。在 realloc(void *ptr, size_t size)
的手册页中,您可以阅读:
If ptr is NULL, then the call is equivalent to malloc(size)
而且realloc
不改变它的参数。它 returns 指向新 allocated/reallocated space 的指针。因此,为了重新分配,您应该使用如下代码:
array = realloc(array,(++size)*sizeof(int));
if (array == NULL) { some error; }
下面的代码只是一个示例,我稍后会用它来说明这一点:
/* Extract digits from an integer and store in an array in reverse order*/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int oct=316;
int* array=malloc(0*sizeof(int*)); //Step 1
int* temp;
size_t size=0;
while(oct/10>0 || oct%10>0){
temp=realloc(array,++size*sizeof(int)); // Step2 requires Step1
if(temp==NULL){
printf("Can't reallocate memory");
exit(-1);
}
else{
array=temp;
}
array[size-1]=oct%10;
oct/=10;
}
for(int i=0;i<size;i++)
printf("%d\n",array[i]);
return 0;
}
realloc 参考 [1] 指出:
Reallocates the given area of memory. It must be previously allocated by malloc(), calloc(), realloc()...
最初我在没有第 1 步的情况下编译了代码,然后 运行 它出现了分段错误。然后我包含了第 1 步,现在代码可以正常编译了。我不想在没有找到要存储的整数的情况下分配一些 space,所以我使用 zero 的大小和 malloc。然而 malloc 参考 [2] 指出:
If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.
现在,我怀疑我的实现是否可移植。我该如何解决这个问题?
我试过 int* array=NULL;
但出现分段错误。
可以发起array
为NULL。在 realloc(void *ptr, size_t size)
的手册页中,您可以阅读:
If ptr is NULL, then the call is equivalent to malloc(size)
而且realloc
不改变它的参数。它 returns 指向新 allocated/reallocated space 的指针。因此,为了重新分配,您应该使用如下代码:
array = realloc(array,(++size)*sizeof(int));
if (array == NULL) { some error; }