在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; }
}
答案 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
可能会失败。