如果我在同一个指针(C)上使用malloc两次会怎么样?

Ace*_*Ace 16 c memory malloc pointers

比方说我创建了一个指针newPtr,我使用malloc(一些大小)然后我再次使用malloc(某个大小)使用相同的指针.怎么了?我在创建第二块内存与第一块相同吗?newPtr是否指向同一地址?

例:

int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = malloc(10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 20

您的程序将有内存泄漏.第一个值newPtr将丢失,你将无法做到free.

我在创建第二块内存与第一块相同吗?

是.您正在分配第二个对象,与第一个对象不同.

newPtr是否指向同一地址?

不.对象是不同的,因此它们的地址是不同的.


Cla*_*diu 11

你实际上并没有使用malloc相同的指针.你根本没有给出指针malloc.malloc总是分配新的内存.因此,同样的事情发生在任何变量赋值的情况下:

int a;
a = 14;
a = 20;
Run Code Online (Sandbox Code Playgroud)

怎么了14?你不能再访问它了.malloc就此而言,您不再具有对其返回的指针的引用,因此您将发生内存泄漏.

如果你真的想使用" malloc使用相同的指针",你可能会对这个realloc函数感兴趣:

int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = realloc(newPtr, 10 * sizeof(int)); //*might leak memory*
Run Code Online (Sandbox Code Playgroud)

从该链接:realloc"更改ptr指向的内存块的大小.该函数可以将内存块移动到新位置(其地址由函数返回)."


编辑:请注意,如果realloc在上面失败,那么它返回NULL,newPtr但未释放指向的内存.根据这个答案,你可以这样做:

void *emalloc(size_t amt){
    void *v = malloc(amt);  
    if(!v) {
        fprintf(stderr, "out of mem\n");
        exit(EXIT_FAILURE);
    }
    return v;
}
void *erealloc(void *oldPtr, size_t amt){
    void *v = realloc(oldPtr, amt);  
    if(!v) {
        fprintf(stderr, "out of mem\n");
        exit(EXIT_FAILURE);
    }
    return v;
}
Run Code Online (Sandbox Code Playgroud)

然后:

int *newPtr;
newPtr = emalloc(10 * sizeof(int));
newPtr = erealloc(newPtr, 10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)