下面的代码只是我稍后使用的一个例子:
/* 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]说明:
重新分配给定的内存区域。必须事先分配 通过malloc(),calloc(),realloc()......
最初我编译了没有step1的代码,并且在运行它时我遇到了分段错误。然后我包括step1,现在代码编译得很好。我不想在没有找到要存储的整数的情况下分配一些空间,因此我使用 malloc 的零大小。但malloc引用[2]表示:
如果size为零,则返回值取决于特定库 实现(它可能是也可能不是空指针),但返回 指针不得解除引用。
现在,我怀疑我的实现是否可移植。我该如何解决这个问题?
我尝试int* array=NULL;
,但我遇到了分段错误。
答案 0 :(得分:6)
您可以将array
发起为NULL。在realloc(void *ptr, size_t size)
的手册页中,您可以阅读:
如果ptr为NULL,则调用等同于malloc(size)
此外realloc
不会更改其参数。它返回指向新分配/重新分配空间的指针。因此,对于重新分配,您应使用如下代码:
array = realloc(array,(++size)*sizeof(int));
if (array == NULL) { some error; }