c - 为什么 realloc() 在 C 中 malloc() 成功的地方失败?

标签 c linux malloc realloc rhel6

在 RHEL6 上,我遇到了 realloc() 的一个奇怪问题。在程序的某个时刻,realloc() 返回 NULL(旧指针有一个地址并且有大量可用内存)。分配的是 200 个结构元素(结构如下)。出于某种原因,当我改为执行 realloc() 时,它可以工作,但我必须将旧指针分配给新指针。下面是我的代码的简化版本。

这可能是服务器调整问题,而不是编程问题。你有什么看法?
谢谢。

//hearder file
typedef struct  {        /* Variable Node Detail Record */
   long     next;
   long     mask;
   char     *value;   
   // more stuff...
} NODETEST;

extern NODETEST *oldNodes;
extern NODETEST *newNodes;

//program
#define MAXSIZE 200

// do some stuff with oldNodes....

int alloc_nodes (void)
{
    // Allocate or grow the table
    oldNodes = (NODETEST *) malloc(MAXSIZE * sizeof(NODETEST));
    if( oldNodes == NULL ) {
            //handle exception...
            exit(1);
      }

    //oldNodes = (NODETEST *) realloc(oldNodes,MAXSIZE * sizeof(NODETEST)); // *** FAILS

    newNodes = (NODETEST *) realloc(oldNodes,MAXSIZE * sizeof(NODETEST));   // *** WORKS

    if( newNodes == NULL ){
        printf("errno=%d\n", errno );
    }else{
        oldNodes = newNodes;            }
}

最佳答案

您首先使用大小 S 调用 malloc,然后使用相同大小 S 调用 realloc。这是错误的:您必须传递给 realloc 新的想要的大小(独立于当前大小 - 它不是增量)。在这里,很有可能 realloc 返回它收到的完全相同的指针。顺便说一句,您不清楚为什么要在 malloc 之后立即执行 realloc。为我们提供更多详细信息。

如果你想要一个大小自动调整的动态表,你需要分配一个初始大小将其大小存储在一个变量中(例如alloc_size)并将当前占用的元素数保存在另一个变量中(例如 n_elem)。当你添加一个元素时,你会增加这个数字。当表已满时重新分配它。这是草图

NODETEST *newNodes = NULL;
int allocated_elem = 0;
int n_elem = 0;

#define ALLOC_INCR 200

然后在每次添加时:

if (n_elem >= alloc_size) { // the first time realloc is as malloc since nodes == NULL
    alloc_size += ALLOC_INCR;
    nodes = (NODETEST *) realloc(nodes, alloc_size * sizeof(NODETEST));
    if (nodes == NULL) {
        //handle exception...
        exit(1);
    }
}
// add your element at nodes[n_elem]
n_elem++;

回想一下,当接收到的指针为 NULL 时(第一次调用的情况),realloc 的行为类似于 malloc。因此它分配了初始表。随后的调用通过以恒定增量(此处为 200)调整大小来重新分配它。一些其他方案也可以用于扩大表格,例如您可以从 32 开始将大小乘以一个因子(例如 2):

if (n_elem >= alloc_size) { // the first time realloc is as malloc since nodes == NULL
    alloc_size = (alloc_size == 0) ? 32 : alloc_size * 2;

注意 FAILWORKS 注释:很明显,如果您分配 oldNodes(在 FAIL 中code) 然后 newNodes 没有被赋值并保持它的初始值为零 (NULL) 因为它被声明为一个全局变量并且没有被初始化(我想,它是extern 这里)。因此测试 if (newNodes == NULL) 可能会失败。

关于c - 为什么 realloc() 在 C 中 malloc() 成功的地方失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221473/

相关文章:

c - C 中仅使用位运算符的符号函数

c - 将 $(sysconfdir) 从 Autoconf/Automake 传递到源代码

java - 从 pdf 表格中填写 excel 中的特定字段

linux - 将 Apache 从默认路径重定向到 Ubuntu Server 中的指定目录

阻止 recv() 返回少于请求字节的情况

c - 使用 stdargs (va_start) 的 C 程序的奇怪行为 (SEGFAULT)

c++ - 为什么在 main() 之前断言会导致语法错误 "error: expected ' )' before numeric constant"?

linux - Linux 中的文件访问计数

c - 尝试分配 2D 数组后出现 EXC_BAD_ACCES

c - 打开文件会导致 sYSMALLOc 断言失败