在 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;
注意 FAIL
和 WORKS
注释:很明显,如果您分配 oldNodes
(在 FAIL
中code) 然后 newNodes
没有被赋值并保持它的初始值为零 (NULL
) 因为它被声明为一个全局变量并且没有被初始化(我想,它是extern
这里)。因此测试 if (newNodes == NULL)
可能会失败。
关于c - 为什么 realloc() 在 C 中 malloc() 成功的地方失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221473/