如果在同一个指针(C)上使用malloc两次会发生什么?
比如说,我创建了一个指针newPtr,我使用malloc(一些大小),然后我再次使用同一个指针使用malloc(一些大小)。会发生什么?然后我是否创建了与第一个内存块大小相同的第二个内存块?newPtr指向同一地址吗 例如:如果在同一个指针(C)上使用malloc两次会发生什么?,c,pointers,memory,malloc,C,Pointers,Memory,Malloc,比如说,我创建了一个指针newPtr,我使用malloc(一些大小),然后我再次使用同一个指针使用malloc(一些大小)。会发生什么?然后我是否创建了与第一个内存块大小相同的第二个内存块?newPtr指向同一地址吗 例如: int *newPtr; newPtr = malloc(10 * sizeof(int)); newPtr = malloc(10 * sizeof(int)); 您的程序将出现内存泄漏。newPtr的第一个值将丢失,您将无法释放它 然后我是否创建了与第一个内存块大小相
int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = malloc(10 * sizeof(int));
您的程序将出现内存泄漏。
newPtr
的第一个值将丢失,您将无法释放它
然后我是否创建了与第一个内存块大小相同的第二个内存块
对。您正在分配第二个对象,与第一个对象不同
newPtr指向同一地址吗
不。对象是不同的,因此它们的地址是不同的。您实际上没有在同一指针上使用malloc
。您根本没有给malloc提供malloc
指针<代码>malloc
始终分配新内存。因此,与任何变量赋值的情况相同:
int a;
a = 14;
a = 20;
14
会发生什么情况?你不能再访问它了。就malloc
而言,这意味着您不再有对它返回的指针的引用,因此将出现内存泄漏
如果您确实想使用“malloc
”和同一个指针,您可能会对以下函数感兴趣:
int *newPtr;
newPtr = malloc(10 * sizeof(int));
newPtr = realloc(newPtr, 10 * sizeof(int)); //*might leak memory*
从该链接: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));
您不是“在同一个指针上使用malloc”。您正在调用malloc()
(分配空间并返回指向该空间的指针),并将其返回值分配给同一个指针对象。(malloc
本身不知道如何处理它返回的结果。)
与任何赋值一样,第二个赋值将替换以前存储的值
这意味着,除非您将它保存到其他地方,否则您不再有指向第一个分配内存块的指针。这是一个很好的例子
此外,您应该始终检查
malloc
返回的结果是否为空指针,如果是,请采取一些纠正措施。在最简单的情况下,这可能只是打印错误消息并终止程序。您绝对不应该假定malloc
调用成功,然后尝试使用(不存在的)分配内存。(这与您的问题无关,但它很容易被忽略,特别是因为在大多数情况下分配失败很少。)这些语句没有在newPtr
上使用malloc
语句newPtr=malloc(10*sizeof(int))代码>导致以下操作:
sizeof(int)
进行计算
该值乘以10
malloc
被调用,并将该产品传递给它
malloc
返回一个值
该值被分配给newPtr
因此,您可以看到,在步骤3,newPtr
没有以任何方式涉及。只有在malloc
完成后,才会涉及newPtr
当您第二次调用malloc
时,它无法知道您正在使用newPtr
执行任何操作。它只分配新空间并返回指向它的指针。然后,新指针被分配给newPtr
,这将擦除newPtr
中的旧值
此时,您无法知道旧值是什么。空间仍然被分配,因为它没有被释放,但您没有指向它的指针。您要学习的关键点是,您不会“在指针上使用malloc”。我问的原因是我试图理解链表。指针指向一个结构。那么我应该使用malloc吗?指针和malloc都很好,问题是使用“指针上的malloc”不是你要做的。指针可以指向您希望它指向的任何对象,并且malloc
返回一个它根据您的请求分配内存的地址。在您的示例中,如果realloc
失败(返回NULL
),该怎么办?内存泄漏@哎呀,糟透了。抢手货尽管如果malloc
和realloc
失败,您可能已经筋疲力尽,但最好明确地处理它。