正式的malloc以后再使用realloc

sjs*_*sam 1 c malloc realloc

下面的代码只是我稍后使用的一个例子:

/* 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;
}
Run Code Online (Sandbox Code Playgroud)

realloc参考文献[1]指出:

重新分配给定的内存区域.它必须先由malloc(),calloc(),realloc()分配...


最初我编译了没有step1的代码,并且在运行它时我遇到了分段错误.然后我包括step1,现在代码编译得很好.我不想没有找到一个整数存储,所以我使用了大小分配一些空间malloc的.然而,malloc参考文献[2]指出:

如果size为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用.

现在,我怀疑我的实现是否可移植.我该如何解决这个问题?

我尝试过,int* array=NULL;但我遇到了分段错误.

Mar*_*ian 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; }
Run Code Online (Sandbox Code Playgroud)

  • 完整性:C11(草案)7.22.3.5/3(http://port70.net/~nsz/c/c11/n1570.html#7.22.3.5p3) (2认同)