我使用此代码,使用此结构,我试图将函数添加到此结构的数组中
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()
答案 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。)