为什么realloc()在malloc()成功进入C的地方失败?

时间:2014-10-06 17:24:49

标签: 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;            }
}

1 个答案:

答案 0 :(得分:1)

您的第一个电话malloc的尺寸为S,然后是realloc且尺寸为S.这是错误的:您必须传递给realloc新的通缉尺寸(独立于当前大小 - 它不是增量)。在这里,realloc很有可能返回它收到的完全相同的指针。顺便说一下,你不清楚为什么要跟malloc紧跟realloc。给我们更多细节。

如果您想要一个大小自动调整的动态表,您需要分配一个初始大小,将其大小存储在变量中(例如alloc_size)并将当前占用的元素数保留在另一个变量中(例如{ {1}})。添加元素时,请增加此数字。当表完全重新分配时。这是一个草图

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++; 时,realloc就像malloc一样(第一次调用的情况)。因此它分配初始表。后续调用通过以恒定增量(此处为200)调整大小来重新分配它。其他一些方案可用于扩大表格,例如,您可以将大小乘以从32开始的因子(例如2):

NULL

重新定位if (n_elem >= alloc_size) { // the first time realloc is as malloc since nodes == NULL alloc_size = (alloc_size == 0) ? 32 : alloc_size * 2; FAIL条评论:很明显,如果您分配WORKS(在oldNodes代码中),则FAIL未分配,保持其初始值为零(newNodes),因为它被声明为全局变量而未初始化(我想,这里是NULL)。因此,测试extern可能会失败。