C 언어
유연한 배열 구성원 크기를 정의하지 않고 구조체 내부의 배열을 처리하는 데 사용됩니다. 이러한 배열은 런타임에 크기를 가져옵니다. 구조 C의 사용자 정의 데이터 유형은 서로 다른 데이터 유형의 여러 구성원을 하나의 이름으로 함께 정의하는 것입니다.
다음은 구문입니다. C에서 구조체를 선언하기 위한 −
struct StructName {
data_type member1;
data_type member2;
// ...
};
여기에서 각 회원 다른 데이터 유형을 가질 수 있습니다. .
유연한 배열 구성원 고정 크기 멤버의 끝에 동적 크기 배열을 보유하고 모두 하나의 메모리 블록에 저장하여 구조를 확장합니다. 이번 장에서는 구조 내부에서 어떻게 작동하는지 살펴보겠습니다.
유연한 배열 구성원 고정된 크기가 없는 구조 내부의 배열이며 해당 메모리는 malloc()을 사용하여 런타임에 동적으로 할당됩니다. , calloc() , 또는 유사한 함수이며 빈 대괄호 []를 사용하여 선언됩니다. .
유연한 배열 멤버 구조의 마지막에 선언해야 하며, 선언하기 전에 다른 멤버가 하나 이상 있어야 합니다.
다음은 유연한 배열 선언 구문입니다. 구조체 내부의 멤버 −
struct StructName {
data_type member1;
data_type flexible_array[]; // flexible array member
};
여기서 data_type 은 배열의 데이터 유형이고 arrayName[] 고정된 크기가 없는 유연한 배열입니다.
유연한 배열 구성원 고정된 크기가 없으므로 컴파일러는 구조 내부에 메모리를 할당하지 않습니다. sizeof 연산자 유연한 배열 멤버를 포함하지 않고 구조의 고정 멤버 크기만 계산합니다. 그렇기 때문에 수동으로 메모리를 할당해야 합니다. 그런 구조를 만들 때.
필요한 총 메모리는 다음과 같이 계산됩니다. -
Total Memory = sizeof(structure) + (number of elements x sizeof(element type))
여기에서는 sizeof(구조) 고정 멤버에 대한 메모리를 제공하며 (요소 수 x sizeof(요소 유형)) 유연한 배열을 위한 메모리를 제공합니다. 이를 추가하면 할당할 총 메모리가 제공됩니다.
다음은 예입니다. 여기서는 하나의 고정 멤버와 유연한 배열로 구조를 정의하고 유연한 배열에 메모리를 할당합니다.
#include <stdio.h>
#include <stdlib.h>
struct Example {
int id;
int arr[]; // flexible array member
};
int main() {
int size = 5;
// Allocate memory for structure + flexible array
struct Example *e = malloc(sizeof(struct Example) + size * sizeof(int));
if (e != NULL) {
printf("Total allocated memory: %zu bytes\n", sizeof(struct Example) + size * sizeof(int));
free(e);
}
return 0;
}
여기에서는 sizeof(구조체 예) 4바이트 제공 ID에 대한 회원. 그런 다음 유연한 배열의 메모리를 계산합니다. 5 x sizeof(int) =20바이트 . 할당된 총 메모리는 4 + 20 =24바이트입니다. . 출력 는 -
Total allocated memory: 24 bytes
이 예에서는 학생 구조를 정의합니다. 하나의 고정 멤버(id ) 및 유연한 배열 멤버(marks ). 메모리를 할당합니다 유연한 배열에 대해 동적으로 접근하고 해당 요소에 액세스합니다. 할당된 크기를 초과하는 요소에 액세스하면 정의되지 않은 동작이 발생하므로 marks[0]에만 액세스합니다. 표시[2] .
#include <stdio.h>
#include <stdlib.h>
struct Student {
int id;
int marks[]; // flexible array member
};
int main() {
int subjects = 3;
// Allocate memory for structure + flexible array
struct Student *s = malloc(sizeof(struct Student) + subjects * sizeof(int));
if (s != NULL) {
s->id = 102;
s->marks[0] = 80;
s->marks[1] = 75;
s->marks[2] = 88;
printf("Student ID: %d\n", s->id);
printf("Marks: %d, %d, %d\n", s->marks[0], s->marks[1], s->marks[2]);
printf("Total allocated memory: %zu bytes\n", sizeof(struct Student) + subjects * sizeof(int));
free(s);
}
return 0;
}
다음은 출력 입니다. 위 프로그램 중 -
Student ID: 102 Marks: 80, 75, 88 Total allocated memory: 16 bytes
realloc() 함수를 사용하여 유연한 배열의 크기를 조정할 수 있습니다. . 이 기능은 기존 메모리 블록을 확장하거나 새 블록을 할당하고 기존 데이터를 자동으로 복사합니다.
유연한 배열의 크기를 조정하려면 realloc() 함수를 호출합니다. 공식을 사용하여 새로운 총 메모리 크기로 계산 -
sizeof(structure) + (new_number_of_elements x sizeof(element_type))참고:항상 realloc() 함수의 결과를 저장하세요. 임시 포인터에서. 실패하면 원래 포인터는 안전하게 유지됩니다. 또한 크기 조정 후 크기 카운터를 업데이트하고 새로 추가된 요소만 초기화합니다.
이 예에서는 학생 구조를 만듭니다. 3점을 유지하려면 처음에는. 나중에 6개 마크를 유지하도록 유연한 배열의 크기를 조정합니다. realloc() 사용 . 이미 저장한 표시는 변경되지 않은 상태로 유지되므로 수동으로 복사할 필요가 없습니다.
#include <stdio.h>
#include <stdlib.h>
struct Student {
int id;
int count; // This field helps track current array size
int marks[]; // Flexible array member
};
int main() {
// Step 1: Initial allocation for 3 marks
int initial_elements = 3;
struct Student *s = malloc(sizeof(struct Student) + initial_elements * sizeof(int));
if (s != NULL) {
s->id = 101;
s->count = initial_elements; // Store current array size
// Display initial sizes
printf("Structure size: %zu bytes\n", sizeof(struct Student)); // Output: 8 bytes (id + count)
printf("Initial array elements: %d\n", s->count); // Output: 3
printf("Initial total memory: %zu bytes\n",
sizeof(struct Student) + initial_elements * sizeof(int)); // Output: 20 bytes
// Step 2: Resize to hold 6 marks
int new_elements = 6;
struct Student *temp = realloc(s, sizeof(struct Student) + new_elements * sizeof(int));
if (temp != NULL) {
s = temp;
s->count = new_elements; // Update array size tracker
// Display new sizes
printf("\nAfter resizing:\n");
printf("Structure size: %zu bytes\n", sizeof(struct Student)); // Still 8 bytes
printf("New array elements: %d\n", s->count); // Output: 6
printf("New total memory: %zu bytes\n",
sizeof(struct Student) + new_elements * sizeof(int)); // Output: 32 bytes
}
free(s);
}
return 0;
}
다음은 출력입니다. 초기 및 크기 조정된 유연한 배열 모두에 대한 구조 크기와 총 메모리를 보여줍니다.
Structure size: 8 bytes Initial array elements: 3 Initial total memory: 20 bytes After resizing: Structure size: 8 bytes New array elements: 6 New total memory: 32 bytes
이번 장에서는 C 구조의 유연한 배열 멤버에 대해 배웠습니다. . 이는 구조의 끝에서 선언되며 가변 길이 데이터를 처리하고, 메모리를 절약하며, 다양한 데이터 크기에 쉽게 적응합니다. 또한 할당, 액세스 및 크기 조정 방법도 살펴보았습니다.
C 언어
로켓 스로트 라이닝용 텅스텐 구리 합금 텅스텐 구리 합금 텅스텐으로 구성된 합금입니다. 및 구리 , 구리와 텅스텐의 장점이 있습니다. 텅스텐 구리 합금은 우수한 특성 덕분에 항공 우주, 항공, 전자, 전력, 야금, 기계, 스포츠 장비 및 기타 산업 분야에서 널리 사용됩니다. 이 기사에서는 로켓 스로트 라이닝을 위한 텅스텐 구리 합금을 살펴보겠습니다. 로켓 스로트 라이닝용 텅스텐 구리 합금 로켓 목 안감이 텅스텐 구리 합금을 주요 생산 재료로 사용하는 이유는 더 높은 작동 온도와 기계적 충격을 견딜 수 있기 때문입니다. 고체 로켓
전 세계 탄소 섬유 시장은 2020년에 37억 달러에 이르렀으며 2031년에는 89억 달러로 성장할 것으로 예상됩니다. 탄소 섬유는 오늘날 사용할 수 있는 가장 유용하고 다재다능한 재료 중 하나가 되는 몇 가지 특성을 가지고 있습니다. 탄소 섬유를 사용하면 많은 이점을 얻을 수 있습니다. 이유를 알아보려면 계속 읽으십시오. 탄소 섬유란 무엇입니까 탄소 섬유는 섬유를 엮어서 만든 폴리머입니다. 이 섬유는 사람의 머리카락보다 작은 직경이 약 5-10마이크로미터인 가닥으로 구성됩니다. 이 섬유를 함께 엮으면 탄소 섬유 직물이 됩니