连续指针分配;重新分配或分配不同?

时间:2014-12-04 14:56:09

标签: c memory

如果我连续地为循环中的指针分配内存,编译器会将其视为单个实例吗?具体地:

for (i = 0; i < SOME_VAL; i++)
{
  char *p = NULL;

  p = malloc(sizeof(char));

  SEND_POINTER_ON_NETWORK(p);
}

每次执行时编译器是否会创建p的新实例,还是会继续将内存分配给p?我正在使用VS2010。

3 个答案:

答案 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函数,或者如果空间已被调用释放   对于freerealloc函数,行为未定义。如果记忆为新的   无法分配对象,旧对象未被释放,其值不变。

     

返回

     

4 realloc函数返回指向新对象的指针(可能具有相同的指针)   value作为指向旧对象的指针),如果新对象不能,则返回空指针   分配

值得注意的是,MSVC编译器并非严格符合所有主题的标准。

但在所引用的两个案例中,我都知道它们符合它。所以它对你的问题也有效。