如果我将内存分配给
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 和长度 0redim
被叫扩大容量adauga
应将 struct produs
添加到列表如果您在编译器中启用警告,您将看到类似以下内容:
warning: passing argument 1 of 'redim' from incompatible pointer type [-Wincompatible-pointer-types]
41 | if (lista->lungime == lista->capacitate) redim(&lista);
| ^~~~~~
| |
| Lista **
这告诉你一些非常重要的事情。你现在所拥有的会导致未定义的行为。
变量
lista
是指向内存中数据位置的指针。您正在将 &redis
重新解释为该指针,但现在 redis
函数将修改存储 lista
指针的内存,而不是它所指向的内容。
这将导致某种形式的内存损坏,因为您的结构体大于指针,并且您正在写入未知的领域。
将呼叫更改为
redim(lista)
将解决此问题。