programing

다이내믹 어레이를 C의 구조체 내부에 포함하려면 어떻게 해야 합니까?

procenter 2022. 8. 28. 21:56
반응형

다이내믹 어레이를 C의 구조체 내부에 포함하려면 어떻게 해야 합니까?

나는 주위를 둘러보았지만 잘 물어봐야 할 질문에 대한 해결책을 찾지 못했다.가지고 있는 코드는 다음과 같습니다.

 #include <stdlib.h>

struct my_struct {
    int n;
    char s[]
};

int main()
{
    struct my_struct ms;
    ms.s = malloc(sizeof(char*)*50);
}

gcc가 나타내는 에러: error: 플렉시블 어레이 멤버의 잘못된 사용

구조체 내부의 s 선언을 선언하면 컴파일 할 수 있습니다.

char* s

그리고 이것은 아마 뛰어난 구현일 것입니다(포인트 연산이 어레이보다 빠릅니다).하지만 c에서는 다음과 같은 선언을 하고 있다고 생각했습니다.

char s[]

와 같다

char* s

C99가 "플렉서블 어레이 멤버"로 칭송하기 전까지는 "구조 해킹"이라고 불렸습니다.에러가 발생하는 이유(아마도 마찬가지)는 세미콜론이 뒤에 와야 하기 때문입니다.

#include <stdlib.h>

struct my_struct {
    int n;
    char s[];
};

여기에 공간을 할당할 때 구조 크기 및 배열에 필요한 공간을 할당합니다.

struct my_struct *s = malloc(sizeof(struct my_struct) + 50);

이 경우 플렉시블 어레이 멤버는 char, sizeof(char)==1의 배열이므로 크기를 곱할 필요는 없지만 다른 malloc의 배열과 마찬가지로 다음과 같이 해야 합니다.

struct dyn_array { 
    int size;
    int data[];
};

struct dyn_array* my_array = malloc(sizeof(struct dyn_array) + 100 * sizeof(int));

편집 : 멤버를 포인터로 변경하는 것과는 다른 결과를 얻을 수 있습니다.이 경우 (일반적으로) 두 개의 개별 할당이 필요합니다. 하나는 구조 자체에 대한 할당이고 다른 하나는 포인터로 가리킬 "추가" 데이터에 대한 할당입니다.유연한 배열 구성원을 사용하면 단일 블록에 모든 데이터를 할당할 수 있습니다.

먼저 무엇을 하려고 하는지 결정해야 합니다.


내부에 [독립] 배열에 대한 포인터가 있는 구조를 사용하려면 다음과 같이 선언해야 합니다.

struct my_struct { 
  int n; 
  char *s;
}; 

이 경우 원하는 방식으로 실제 구조 객체를 작성할 수 있습니다(예: 자동 변수).

struct my_struct ms;

그 후 어레이에 메모리를 개별적으로 할당합니다.

ms.s = malloc(50 * sizeof *ms.s);  

실제로 어레이 메모리를 동적으로 할당할 필요는 없습니다.

struct my_struct ms;
char s[50];

ms.s = s;

이 모든 것은 이러한 객체에서 필요한 수명 유형에 따라 달라집니다.구조가 자동인 경우 대부분의 경우 배열도 자동이 됩니다.structure 객체가 어레이 메모리를 소유하고 있는 경우 그렇지 않으면 의미가 없습니다.구조 자체가 동적인 경우 어레이도 일반적으로 동적이어야 합니다.

이 경우 구조와 배열이라는 두 개의 독립된 메모리 블록이 있습니다.


완전히 다른 접근법은 "구조 해킹" 관용어를 사용하는 것입니다.이 경우 배열은 구조의 필수 요소가 됩니다.둘 다 단일 메모리 블록에 있습니다.C99에서는 구조가 다음과 같이 선언될 것이다.

struct my_struct { 
  int n; 
  char s[];
}; 

개체를 만들려면 전체 개체를 동적으로 할당해야 합니다.

struct my_struct *ms = malloc(sizeof *ms + 50 * sizeof *ms->s);

이 경우 메모리 블록 크기는 구조 부재와 런타임 크기의 후행 배열을 수용하도록 계산됩니다.

이 경우 정적 또는 자동 개체와 같은 구조 개체를 작성할 수 있는 옵션이 없습니다.끝에 유연한 어레이 멤버가 있는 구조는 C에서만 동적으로 할당할 수 있습니다.


포인터 Aritmetics가 어레이보다 빠르다는 가정은 완전히 틀렸습니다.어레이는 포인터 산술의 정의에 따라 동작하기 때문에 기본적으로 동일합니다.게다가 정규 배열(포인터로 붕괴되지 않음)은 일반적으로 포인터 객체보다 조금 더 빠릅니다.포인터 값은 메모리에서 읽어야 하며, 메모리 내의 어레이 위치는 어레이 개체 자체에서 "알 수 있는" 위치(또는 "계산된" 위치)입니다.

지정되지 않은 크기의 배열을 사용할 수 있는 것은 구조체의 끝 부분뿐이며 일부 컴파일러에서만 작동합니다.이것은 비표준 컴파일러 확장입니다.(단, C++0x에서 허용될 것으로 기억합니다.)

구조 though.단, 어레이는 구조에서 별도의 할당이 되지 않습니다에서에 대한 배열이 되지 않을 것이다 별도의 할당.그래서 당신은, 모든 것을 할당해 둘 필요가 있습니다 모든이 때문에의 할당할 필요가 있다.my_struct뿐만 아니라 배열 부분이다.어레이 부품뿐만 아니라

제가 하는 일은 단순히 배열지만 0이 아닌 작은 크기로 드린다.크기를 0이 아닌작은 크기로 지정합니다어레이의.보통 4문자 배열에, 2보통문자배열의 경우 4개,문자배열의 경우 2개.wchar_tArrays 32비트 정렬을 유지하는 것이다.32비트 얼라인먼트를 유지합니다.

그런 다음 할당을 수행할 때 어레이의 선언 크기를 고려할 수 있습니다.어떤 경우든 힙 매니저가 작업하는 정밀도보다 슬롭이 작다는 이론에 동의하지 않는 경우가 많습니다.

또한 할당에 size of (char*)를 사용하지 않는 것이 좋다고 생각합니다.

난 이렇게 할 거야

struct my_struct {
    int nAllocated;
    char s[4]; // waste 32 bits to guarantee alignment and room for a null-terminator
};

int main()
{
    struct my_struct * pms;
    int cb = sizeof(*pms) + sizeof(pms->s[0])*50;
    pms = (struct my_struct*) malloc(cb);
    pms->nAllocated = (cb - sizoef(*pms) + sizeof(pms->s)) / sizeof(pms->s[0]);
}

어레이는 포인터로 해결되며 여기서 정의해야 합니다.s~하듯이로char *s. 구조 기본적으로 있는 용기, 그리고(내 기억이 맞다면), 간단히 가능하지 않다는 그 안에서 동적으로 크기의 배열을 갖는 크기 고정되어야 한다.구조체는 기본적으로 컨테이너이며,고정 크기(IRC)여야 합니다.따라서 동적 크기의 어레이를 내부에 배치하는 것은 불가능합니다.네가그러니까...malloc어쨌든 기억 Ing, 이것이 당신 후의 것에 어떤 차이가 만들어서는 안 된다.어쨌든 기억을 더듬어봤자 네가 원하는 게 달라지진 않을 거야

'이렇게 하다'라고 하는 죠.s메모리 위치를 나타냅니다.에 이 할 수 .s[0].

포인터 연산이 어레이보다 빠르죠?

전혀 그렇지 않아. 사실 그들은 똑같아.어레이는 컴파일 시 포인터 산술로 변환됩니다.

char test[100];
test[40] = 12;

// translates to: (test now indicates the starting address of the array)
*(test+40) = 12;

컴파일러는 자동변수를 선언할 경우 s[]에 할당해야 하는 공간을 알 수 없는 것으로 생각됩니다.

벤의 말에 동의해요. 당신의 구조를 선언하세요.

struct my_struct {
    int n;
    char s[1];
};

스토리지에 하게 하기 , 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」라고 선언합니다.char *s되어 있기 에) 하지 않고 할당한다( 「 」 ) 。s더미에서, 그것이 할 일은 첫 번째를 해석하는 것이다.sizeof(char *)어레이의 바이트 수를 포인터로 지정하기 때문에 사용자가 생각하는 데이터를 조작하지 않고 치명적일 수 있습니다.

포인터와 어레이의 조작은 같은 방법으로 실장할 수 있지만, 같은 것은 아니라는 것을 기억하는 것이 중요합니다.

c의 구조 내에 어레이를 저장하는 작업 코드와 어레이 요소에 값을 저장하는 방법 의문 사항이 있으면 의견을 남겨주세요.최선을 다해 설명하겠습니다.

구조 정의:

struct process{
    int process_id;
    int tau;
    double alpha;
    int* process_time;
};

프로세스 구조에 대한 메모리 할당:

 struct process* process_mem_aloc = (struct process*) malloc(temp_number_of_process * sizeof(struct process));

다중 프로세스 및 각 프로세스 업데이트 프로세스 루프_time dyanamic 배열

int process_count = 0;
int tick_count = 0;


while(process_count < number_of_process){


  //Memory allocation for each array of the process, will be containting size equal to number_of_ticks: can hold any value

        (process_mem_aloc + process_count)->process_time = (int*) malloc(number_of_ticks* sizeof(int));

파일에서 한 줄씩 데이터를 읽고, process_time 배열에 저장한 후 저장된 값에서 인쇄합니다. 다음으로 루프가 프로세스 내부에 있는 동안 루프

        while(tick_count < number_of_ticks){

            fgets(line, LINE_LENGTH, file);
            *((process_mem_aloc + process_count)->process_time + tick_count) = convertToInteger(line);;
            printf("tick_count : %d , number_of_ticks %d\n",tick_count,*((process_mem_aloc + process_count)->process_time + tick_count));
            tick_count++;
        }

        tick_count = 0;

생성되는 코드는 동일합니다(어레이와 ptr).어레이가 컴파일되지 않는 것을 제외하고

및 BTW - c++를 실행하고 벡터를 사용합니다.

언급URL : https://stackoverflow.com/questions/2060974/how-to-include-a-dynamic-array-inside-a-struct-in-c

반응형