在C中实现产品列表

问题描述 投票:0回答:1

如果我将内存分配给 list->v[list->length],则会出现访问冲突

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

typedef struct {
    char* denumire, * producator;
    int cantitate;
}produs;
typedef struct {
    produs** v;
    int lungime;
    int capacitate;
} Lista;

produs crearePr(char* nume, char* producator, int cantitate)
{
    produs material;   
    material.denumire = (char*)malloc(strlen(nume) + 1);
    strcpy(material.denumire, nume);
    material.producator = (char*)malloc(strlen(producator) + 1);
    strcpy(material.producator, producator);
    material.cantitate = cantitate;
    return material;
}

void creareLi(Lista* lista)
{
    lista->lungime = 0;
    lista->capacitate = 1;
    lista->v = (produs**)malloc(sizeof(produs*) * lista->capacitate);
}

void redim(Lista *l)
{
    l->capacitate *= 2;
    l->v = (produs**)realloc(l->v,sizeof(produs) * l->capacitate);
}

void adauga(Lista *lista, produs p)
{
    if (lista->lungime == lista->capacitate) redim(&lista);
    
    lista->v[lista->lungime] = (produs*)malloc(sizeof(produs));
    *lista->v[lista->lungime] = p;
    lista->lungime++;

}

int main()
{
    Lista lista;
    creareLi(&lista);
    adauga(&lista, crearePr("Zahar", "Tarom", 100));
    return 0;
}

crearePr 应该创建一个 struct produs creareLi 应该初始化列表,设置容量 1 和长度 0 重新调整以获得更多空间 adauga 应该将 struct produs 添加到列表中 lista->v[i] 必须指向产品编号。我

c dynamic-memory-allocation
1个回答
0
投票

如果您在编译器中启用警告,您将看到类似以下内容:

warning: passing argument 1 of 'redim' from incompatible pointer type [-Wincompatible-pointer-types]
   41 |     if (lista->lungime == lista->capacitate) redim(&lista);
      |                                                    ^~~~~~
      |                                                    |
      |                                                    Lista **

这告诉你一些非常重要的事情。你现在所拥有的会导致未定义的行为。

将呼叫更改为

redim(lista)
将解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.