重新分配内存后出现访问冲突

问题描述 投票: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
  • redim
    被叫扩大容量
  • adauga
    应将
    struct produs
    添加到列表
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 **

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

变量

lista
是指向内存中数据位置的指针。您正在将
&redis
重新解释为该指针,但现在
redis
函数将修改存储
lista
指针的内存,而不是它所指向的内容。

这将导致某种形式的内存损坏,因为您的结构体大于指针,并且您正在写入未知的领域。

将呼叫更改为

redim(lista)
将解决此问题。

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