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)