如果我连续地为循环中的指针分配内存,编译器会将其视为单个实例吗?具体地:
for (i = 0; i < SOME_VAL; i++)
{
char *p = NULL;
p = malloc(sizeof(char));
SEND_POINTER_ON_NETWORK(p);
}
每次执行时编译器是否会创建p
的新实例,还是会继续将内存分配给p
?我正在使用VS2010。
答案 0 :(得分:1)
char *p = NULL;
p = malloc(sizeof(char));
如果您尝试将已分配的内存扩展到p
,则使用p
对循环内的malloc()的每次调用都会为指针realloc()
分配新的内存位置。 / p>
答案 1 :(得分:0)
内存管理系统在malloc中查找参数大小的空闲内存槽(在本例中为sizeof(char))。您不会将内存从一次迭代释放到下一次迭代。因此,内存管理系统“看到”内存占用并为指针p分配新的内存槽。 您的代码中存在内存泄漏。
答案 2 :(得分:0)
来自ISO / IEC 9899:
(称为c99标准)
7.20.3.3
malloc
函数概要
1
#include <stdlib.h>
void *malloc(size_t size);
描述
2 malloc函数为大小由
size
指定的对象分配空间 其价值是不确定的。返回
3 malloc函数返回空指针或指向已分配空间的指针。
您期望的行为将通过realloc进行,其描述如下:
7.20.3.4
realloc
函数概要
1
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
描述
2 realloc函数释放
ptr
指向的旧对象并返回a 指向具有size
指定大小的新对象的指针。新内容 在解除分配之前,对象应与旧对象的对象相同,直到较小的对象 新旧尺寸。新对象中超出旧对象大小的任何字节都有 不确定的价值观。3如果
ptr
是空指针,realloc
函数的行为类似于malloc
函数 指定大小。否则,如果ptr
与之前返回的指针不匹配 calloc,malloc或realloc函数,或者如果空间已被调用释放 对于free
或realloc
函数,行为未定义。如果记忆为新的 无法分配对象,旧对象未被释放,其值不变。返回
4
realloc
函数返回指向新对象的指针(可能具有相同的指针) value作为指向旧对象的指针),如果新对象不能,则返回空指针 分配
值得注意的是,MSVC编译器并非严格符合所有主题的标准。
但在所引用的两个案例中,我都知道它们符合它。所以它对你的问题也有效。