cuốn sách gpt4 ai đã làm

Làm cách nào để giải quyết vấn đề cấp phát bộ nhớ trong hàm sau? (phân phát)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 03:11:33 27 4
mua khóa gpt4 Nike

Tôi cần đọc tệp .txt và gán từng từ trong tệp vào một cấu trúc được trỏ từ một vectơ cấu trúc. Tôi sẽ giải thích nó tốt hơn dưới đây.

Cảm ơn sự giúp đỡ của bạn.

Chương trình của tôi chỉ phân bổ từ đầu tiên của tệp...

Tôi biết vấn đề nằm ở hàm Inside_termo() vì tôi đã kiểm tra fscanf whitout khi gọi hàm đó và nó hoạt động tốt.

kết cấu

cấu trúc typedef _item
{
int conta;
char *termo;
} Mục;

cấu trúc typedef _mapa
{
int Total; // số của nó không có bản đồ
int khối; // số khối của nó
Mục **lista; // bác sĩ điều chỉnh thông tin
} Bản đồ;

chủ yếu

int main()
{
Bản đồ mp;
TẬP TIN *arq;
int i, kết quả, numPalavras;
phao x;
int valor, max, min, mincar;
char caminho[20];
char termo[40];
int tam;

inicia_mapa(&mp);

giá trị = menu();

Đây là phần quan trọng trong mã của tôi. Tôi đọc tệp trong đường dẫn do người dùng cung cấp và gọi hàm insere_termo();, chịu trách nhiệm phân bổ struct mỗi từ trong .

công tắc (giá trị)
{
trường hợp 1:
printf ("*Ler Arquivo* \n");
printf("Số caminho: ");
scanf("%s", caminho);

arq = fopen(caminho,"r"); // abrir arquivo no caminho especado
nếu (arq == NULL)
{
printf("Lỗi, không có khả năng xảy ra sự cố hoặc arquivo\n");
}

while(fscanf(arq, "%s", termo) != EOF)
{
//Adiciona cada palavra no vetor
insere_termo(&mp, termo);
}

phá vỡ;

chức năng

INICIA_MAPA() là hàm chịu trách nhiệm bắt đầu ánh xạ, phân bổ một khối chứa 10 con trỏ tới "mục" cấu trúc.

INSERE_TERMO() là hàm chịu trách nhiệm gán các từ được cung cấp bởi tệp văn bản. Có một số vấn đề với việc cấp phát bộ nhớ nhưng tôi không thể giải quyết được. Mọi trợ giúp đều được chào đón.

void inicia_mapa (Mapa *mp) //inicia um mapa vazio
{
mp->lista = (Item**)malloc(BLOCK*sizeof(Item*));
mp->tổng = 0;
mp->blocos = 1;
}

void insere_termo (Mapa *mp, char *s) // insere um item com termo se conta = 1
{

if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
{
mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
mp->blocos++;
}

mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // định vị mục trên bản đồ

if (mp->lista[mp->total] == NULL)
{
printf("Lỗi ghi nhớ tập tin\n");
thoát (0);
}

strcpy(mp->lista[mp->total]->termo, s); // Nhập vào termo s
printf("%s\n", mp->lista[mp->total]->termo);
mp->lista[mp->total]->conta++;
mp->total++; //contagem làm tổng

}

câu trả lời hay nhất

strcpy(mp->lista[mp->total]->termo, s); thất bại như mp->lista[mp->total]->termo Chưa được phân công. con trỏ sẽ chưa được khởi tạo Pp được chuyển tới strcpy(p, ...) Đúnghành vi không xác định (UB).

Thay vào đó phân bổ bộ nhớ và sau đó sử dụng strcpy() Tạo một bản sao

// strcpy(mp->lista[mp->total]->termo, s);
p->lista[mp->total]->termo = malloc(strlen(s) + 1);
strcpy(p->lista[mp->total]->termo, s);
// hoặc
p->lista[mp->total]->termo = strdup(s);

Đảm bảo giải phóng bộ nhớ khi hoàn tất.


Có thể có những vấn đề khác.

Về c - Làm thế nào để giải quyết vấn đề cấp phát bộ nhớ trong hàm sau? (bài tập), chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/55885441/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress