C 未添加的结构数组

C 未添加的结构数组,c,pointers,dynamic-memory-allocation,C,Pointers,Dynamic Memory Allocation,嘿,一个月前我们在大学里开始使用C,现在我们有一个作业,我们需要在结构数组上使用动态分配。这是我创建回购协议的代码: ''' ''' 这些是我正在测试的函数,我得到的断言失败了: ''' int-grow(回购*Repo){ 断言(repo!=NULL); 断言(回购->项目!=NULL); Item*new_repo=malloc((2*repo->allocatedSlots)*sizeof(Item)); if(new_repo==NULL) 返回0;//分配失败! memcpy(新回购、

嘿,一个月前我们在大学里开始使用C,现在我们有一个作业,我们需要在结构数组上使用动态分配。这是我创建回购协议的代码: '''

''' 这些是我正在测试的函数,我得到的断言失败了: '''

int-grow(回购*Repo){
断言(repo!=NULL);
断言(回购->项目!=NULL);
Item*new_repo=malloc((2*repo->allocatedSlots)*sizeof(Item));
if(new_repo==NULL)
返回0;//分配失败!
memcpy(新回购、回购->项目、规模(回购)*回购->数量项目);
免费(回购->项目);
回购->项目=新回购;
repo->allocatedSlots*=2;
免费(新回购);
返回1;//成功
}
内部附加项(回购*回购,项目){
对于(int index=0;indexnumberOfItems;index++)
如果(回购->项目[索引].ID==项目.ID)
返回0;//项已存在
//printf(“%d%d”,item.ID,item.value);
if(回购->数量项目<回购->分配的插槽){
char*type=(char*)malloc(strlen(item.type)*sizeof(char)),*state=(char*)malloc(strlen(item.state)*sizeof(char));
strcpy(类型、项目、类型);
strcpy(状态、项目状态);
//回购->项目【回购->项目数量+1】=&项目;
回购->项目[repo->numberOfItems+1].ID=(int)item.ID;
//printf(“js%d”,回购->项目[repo->numberOfItems+1].ID);
回购->项目[repo->numberOfItems+1].value=item.value;
strcpy(repo->items[repo->numberOfItems+1]。状态,状态);
strcpy(回购->项目[repo->numberOfItems+1]。类型,类型);
回购->numberOfItems++;
}
否则{
成长(回购);
回购->项目[repo->numberOfItems+1].ID=item.ID;
回购->项目[repo->numberOfItems+1].value=item.value;
strcpy(repo->items[repo->numberOfItems+1]。状态,item.state);
strcpy(回购->项目[repo->numberOfItems+1]。类型,项目。类型);
回购->numberOfItems++;
}
返回1;//添加成功!
}
void AddItem\u ValidInput\u AddedToList(){
Repo*Repo=init();
项目;
int id=1,value=100;
char*state=“新建”;
char*type=“Uglyo”;
item=createItem(id、值、状态、类型);
附加条款(回购协议,项目);
//printf(“sdfsdfsfs”);
//printf(“%d\n”,repo->items[0].ID);
断言(repo->items[0].ID==item.ID);
//printf(“%d”,项目->ID);
销毁(回购);
}
'''
最后一个是我首先做的测试用例。

问题很可能出现在这里:

char* type = (char*)malloc(strlen(item.type)*sizeof(char)), *state = (char*)malloc(strlen(item.state) * sizeof(char));
strcpy(type, item.type);
strcpy(state, item.state);
这里您忘记了C中的
char
字符串实际上被称为以null结尾的字节字符串。C中的字符串是以零结尾的字符序列。strlen不计算此零,但仍需要为其分配空间

您需要为字符串分配
strlen(…)+1
字节:

char* type = malloc(strlen(item.type) + 1);
char* state = malloc(strlen(item.state) + 1);
strcpy(type, item.type);
strcpy(state, item.state);
或者如果您的系统具有
strdup
功能(很可能)


您的
grow
功能也有非常严重的问题:

Item* new_repo = malloc((2 * repo->allocatedSlots)*sizeof(Item));
repo->items = new_repo;
free(new_repo);
首先,分配内存并使
new\u repo
指向该内存

然后让
repo->items
指向相同的内存。现在有两个指针指向完全相同的内存

然后释放内存,使
new_repo
repo->items
指针无效

您不应该
免费(新建)

或者改用,例如(正如我在评论中已经建议的):


变量在哪里?你怎么称呼它?无法用提供的信息来回答,但断言失败通常很容易找到和修复,尤其是您的断言失败,它只是空检查。显然有些东西是空的。您忘记调用init()了吗?
断言如何?哪个在开火?请考虑读者需要什么信息。其中,我检查位置[0]上的项目是否与通过域创建的项目相同。您的索引在
addItem
中处于关闭状态。例如,
repo->items[repo->numberOfItems+1].ID
索引应该是
repo->numberOfItems
。在那一行之后的所有其他人也是如此。只需考虑您的<代码> AsReSt(RePop>项目[0 ] .ID=项目I.ID);<代码>。它正在查看索引
0
,但是
addItem
中的
+1
确保从不填写索引0。为什么不使用,而不是手动调用
malloc
memcpy
?为True,OP应该会解决这个问题。但是看起来测试用例不会触发
grow
。好吧,但是当我使用这个方法时,我在尝试调用函数时就遇到了访问冲突。
char* type = malloc(strlen(item.type) + 1);
char* state = malloc(strlen(item.state) + 1);
strcpy(type, item.type);
strcpy(state, item.state);
char* type = strdup(item.type);
char* state = strdup(item.state);
Item* new_repo = malloc((2 * repo->allocatedSlots)*sizeof(Item));
repo->items = new_repo;
free(new_repo);
int grow(Repo* repo) {
    Item* new_repo = realloc(repo->items, 2 * repo->allocatedSlots * sizeof(Item));
    if (new_repo == NULL)
        return 0;  // Failure to allocate

    repo->items = new_repo;
    repo->allocatedSlots *= 2;
    return 1;
}