realloc()无效的nxt大小

时间:2014-12-06 16:01:09

标签: c realloc

我使用此代码,使用此结构,我试图将函数添加到此结构的数组中

typedef struct goods{
    char *name;
    int num;
} goods;

void addWord(char *what, goods *where, int pnr, int *arrsize, int n){               
    if (pnr >= *arrsize){
        where = (goods*)realloc(where,*arrsize*2*sizeof(goods*));
        *arrsize*=2;
    }
    where[pnr].name = (char*)malloc(strlen(what)*sizeof(char));
    strcpy(where[pnr].name,what);
    where[pnr].num = n;
}

在主要功能中我有这个:

int extstore = 1;
goods *store = (goods*)malloc(1*sizeof(goods*)); 

    addWord(line, store, nr, &extstore, n);

为什么我在where = (goods*)realloc(where,*arrsize*2*sizeof(goods*));的{​​{1}}行上收到“无效的下一个尺寸”运行时错误?

编辑:

addWord()

2 个答案:

答案 0 :(得分:1)

extstore * sizeof(goods*) * 2

应该是extstore * sizeof(goods) * 2,因为应该分配结构的空间 - 而不仅仅是指针。

您的代码存在根本问题。您正在按值传递指针,这意味着对函数外部不会显示对指针(不是指向的变量,而是指针本身)所做的任何更改。您应该通过指针传递指针,并且应该检查从realloc返回的结果。其次,不要将realloc的结果分配回同一个指针 - 如果失败,你将丢失指向内存的指针 - >因此,会发生内存泄漏。

通过指针传递指针:

void addWord( char *what, goods **where, size, ...) {
  if ( *where == NULL) return; // nothing to do
  if ( size < 1) return;       // it would result in realloc=free call 
  goods *res = NULL;
  res = realloc( *where, size * sizeof( goods));

  if ( res != NULL) {
     *where = res;
   }
   else {
     // Error (re)allocating memory
     // If realloc() fails the original block is left untouched,
     // it is not freed or moved, so here *where is unchanged
   }

C中没有必要从malloc转换结果。

*`path'出错:realloc():下一个大小无效:0x0000000000ec8010 *

此失败必须是因为“where”由于执行中较早的堆损坏而无效。

答案 1 :(得分:0)

C是按值传递。

这意味着更改函数中的参数不会更改它初始化的表达式。

因此,第一次realloc移动内存时,main中的指针会变坏。

要纠正此问题,请使用额外的间接级别,或者最好将新值作为结果返回。

(无论如何,您应该检查分配失败(malloc realloc),
you should not cast from void* to any pointer-type in C。)