gpt4 book ai didi

c - realloc() 无效的 nxt 大小

转载 作者:行者123 更新时间:2023-11-30 21:02:56 26 4
gpt4 key购买 nike

我使用这个代码,使用这个结构,我试图创建函数将项目添加到这个结构的数组中

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*)); 线上收到“无效的下一个尺寸”运行时错误在addWord()

编辑:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

int main()
{
int linelen, i, nr = 0, current_r;
char *line = NULL;
size_t len = 0;
int extstore = 1;
goods *store;
store = malloc(extstore*sizeof(goods*));

while (1){
while ((linelen = getline(&line, &len, stdin)) != -1){
if (line[linelen - 1] == '\n'){
line[linelen - 1] = '\0';
}

linelen = strlen(line);

if (line[0] == '#'){
if (sscanf(line,"#%d",&current_r) != 1){
printf("bad input.");
return 0;
} else continue;
}

if (nr >= extstore){
store = realloc(store,extstore * sizeof(goods*) * 2);
extstore*=2;
}

store[nr].name = malloc(strlen(line)*sizeof(char));
strcpy(store[nr].name,line);
store[nr].r = current_r;

nr++;
}
if (linelen == -1) break;
}

printf("\n");
for (i = 0;i < nr;i++){
printf("%s, [id:%d]\n", store[i].name, store[i].r);
}
return 0;
}

最佳答案

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”由于执行早期的堆损坏而无效。

关于c - realloc() 无效的 nxt 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com