如果在同一个指针上两次使用malloc会发生什么(C语言)?

11 浏览
0 Comments

如果在同一个指针上两次使用malloc会发生什么(C语言)?

比如说我创建了一个指针newPtr,然后我使用malloc(一些大小)来分配内存,然后再次使用malloc(一些大小)来分配内存,使用相同的指针。会发生什么?我是否创建了一个与第一个相同大小的第二个内存块?newPtr指向相同的地址吗?\n例子:\n

int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = malloc(10 * sizeof(int));

\n当第二次调用malloc函数时,将分配一个新的内存块,并将指针newPtr指向该内存块的起始地址。这将导致第一个内存块的地址丢失,无法访问和释放。因此,newPtr指向的是第二个内存块的地址。

0
0 Comments

这个问题的出现原因是在使用malloc的时候没有正确操作指针newPtr。在调用malloc时,newPtr并没有参与任何操作。只有在malloc完成之后,newPtr才会被赋值。

当第二次调用malloc时,它无法知道你正在对newPtr做任何操作。它只是分配了新的空间并返回一个指向它的指针。然后这个新的指针被赋值给newPtr,这样就覆盖了原来的值。

在这一点上,你无法知道原来的值是什么。空间仍然被分配,因为没有被释放,但是你没有指向它的指针。

解决方法是在使用malloc之前,先释放newPtr指向的空间。这可以通过调用free(newPtr)来实现。这样可以确保在调用malloc之前没有未释放的内存块,并且newPtr指向的是一个新的内存块。

以下是解决方法的示例代码:

free(newPtr);
newPtr = malloc(10 * sizeof(int));

这样,在每次调用malloc之前都释放newPtr指向的内存块,就可以避免出现问题。

0
0 Comments

使用malloc两次分配内存给同一个指针是不正确的。因为malloc总是分配新的内存空间,而不是将内存分配给已有的指针。这就类似于对变量进行赋值操作,当你将一个新值赋给变量时,旧的值就无法再访问了。对于malloc来说,这意味着你不再拥有指向它返回的指针的引用,因此会导致内存泄漏。

如果你真的想要"使用相同的指针进行malloc",你可能会对realloc函数感兴趣。根据这个链接所述: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;
}

然后你可以这样使用:

int *newPtr;
newPtr = emalloc(10 * sizeof(int));
newPtr = erealloc(newPtr, 10 * sizeof(int));

在你的示例中,如果realloc失败(返回NULL),将会导致内存泄漏。所以最好在代码中显式处理这种情况。

0
0 Comments

使用malloc两次会导致内存泄漏。第一次分配的newPtr的值会丢失,无法进行free操作。

是的。你正在分配第二个与第一个不同的对象。

不是的。这两个对象是不同的,所以它们的地址也是不同的。

解决方法是在使用malloc分配内存之前,先检查指针是否已经分配了内存。如果已经分配了内存,则需要先使用free释放内存,然后再进行第二次分配。

代码示例:

int* newPtr = malloc(sizeof(int));
if (newPtr != NULL) {
    // 第一次分配内存成功,可以进行相应操作
    *newPtr = 10;
    printf("Value: %d\n", *newPtr);
    
    // 第二次分配内存之前,先释放第一次分配的内存
    free(newPtr);
    
    newPtr = malloc(sizeof(int));
    if (newPtr != NULL) {
        // 第二次分配内存成功,可以进行相应操作
        *newPtr = 20;
        printf("Value: %d\n", *newPtr);
        
        // 释放第二次分配的内存
        free(newPtr);
    }
}

通过以上代码,我们可以避免重复使用malloc导致的内存泄漏问题。

0