malloc () 및 realloc () 구조
Sep 30 2020
구조에 메모리를 동적으로 할당 할 수 있습니까? 동적으로 할당 된 구조에 접근하는 올바른 절차입니까? 방법 malloc()과 realloc()구조 를 가르쳐주세요 .
newnode는 struct List * 유형이지만 인덱싱을 시작할 때 struct List로 변환됩니다.이 변환이 어떻게 가능합니까? 내 삽입 함수는 (struct List *) 만 허용합니까?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List {
char val[20];
};
void insert(struct List *);
int main(void) {
int i = 0;
int size = 1;
struct List *newnode = (struct List *)malloc(size * sizeof(struct List));
for (i = 0; i < 5; i++) {
if (size <= i) {
size = size + size;
newnode = (struct List *)realloc(newnode, size * sizeof(struct List));
}
scanf("%s", newnode[i].val);
insert(newnode[i]);
}
for (i = 0; i < 5; i++) {
printf("%s\n", newnode[i].val);
}
return 0;
}
void insert(struct List *node) {
printf("%s\n", node->val);
}
답변
1 chqrlie Sep 30 2020 at 00:34
코드는 3 가지 문제를 제외하고 작동합니다.
메모리 할당 실패를 테스트하지 않습니다. 메모리를 할당 할 수없는 경우
malloc()및 둘 다realloc()반환NULL됩니다newnode. 역 참조 가 발생 하면 정의되지 않은 동작 이 발생합니다.realloc()실패한 경우를 정상적으로 처리하려면 할당 해제되지 않은 이전 배열에 계속 액세스하여 해제 할 수 있도록 재 할당 된 포인터를 다른 변수에 저장해야합니다.scanf("%s", newnode[i].val);보안 결함입니다. 다음을 사용하여 대상 배열에 저장할 수있는 바이트 수를 제한해야합니다.scanf("%19s", newnode[i].val);scanf()유효하지 않거나 누락 된 입력을 감지하기 위해 의 반환 값을 테스트하지 않습니다 .insert()아무것도 삽입 하지 않습니다 .
다음은 오류 처리와 덜 혼동되는 이름이있는 수정 된 버전입니다.
#include <stdio.h>
#include <stdlib.h>
struct Item {
char val[20];
};
//void insert(struct Item *);
int main(void) {
int i, j;
int size = 0;
struct Item *array = NULL;
for (i = 0; i < 5; i++) {
if (i >= size) {
int newsize = size ? 1 : size + size;
struct Item *newarray = realloc(array, sizeof(*array) * size);
if (newarray == NULL) {
perror("cannot reallocate the array");
break;
}
size = newsize;
array = newarray;
}
if (scanf("%19s", array[i].val) != 1) {
fprintf(stderr, "missing input\n");
break;
}
//insert(array[i]);
}
for (j = 0; j < i; i++) {
printf("%s\n", array[i].val);
}
free(array);
return 0;
}