如果我将内存分配给 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] 必须指向产品编号。我
如果您在编译器中启用警告,您将看到类似以下内容:
warning: passing argument 1 of 'redim' from incompatible pointer type [-Wincompatible-pointer-types]
41 | if (lista->lungime == lista->capacitate) redim(&lista);
| ^~~~~~
| |
| Lista **
这告诉你一些非常重要的事情。你现在所拥有的会导致未定义的行为。
将呼叫更改为
redim(lista)
将解决此问题。