문제

구조물을 사용하고 있으며 최대 10 포트를 초기화하고 싶습니다. 그러나 프로그램이 실행될 때는 훨씬 적을 수 있으며, 런타임까지 알 수 없습니다. 그러나 이것은 최대입니다. 나는 일반적으로 Calloc 및 Delcare를 값 유형으로 사용하여 동적으로 할당하기 때문에 이전에는 이와 같은 구조를 한 번도 해본 적이 없습니다.

그러나 나는 이것을 이해할 수 없다

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

그리고

*ports = (struct port_t*) calloc(2, sizeof(*ports)); 

무료 상점에 할당 된 2 개의 포트 개체를 가리키는 단일 포인터를 할당하는 것 같습니다.

화살표 연산자가있는 도트 연산자를 사용하는 이유를 이해할 수 없습니까? 포트 [0]-> port_id = 20; printf ( "port_id : %d n", ports [0]-> port_id);

#include <stdio.h>
#include <stdlib.h>

#define MAX_PORTS 10

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

int main(void)
{
    *ports = (struct port_t*) calloc(2, sizeof(*ports));

    ports[0]->port_id = 20;

    printf("port_id: %d\n", ports[0]->port_id);

    return 0;
}

일반적으로, 내가 통과 한 것은 다음과 같습니다.

struct port_t
{
    int port_id;
    char name;
} *ports;

ports = (struct port_t*) calloc(2, sizeof(*ports));

그런 다음 아래 중 하나와 함께 할당하십시오. 그러나 이전 프로그래머는 상단에 표시 한 것처럼 모든 것을 선언하여 아무것도 변경할 수 없었습니다.

ports[0].port_id = 10;
ports->port_id = 10;

제안에 감사드립니다.

도움이 되었습니까?

해결책

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

예, 당신은 10 개의 포인터를 만들고 있습니다

*ports = (struct port_t*) calloc(2, sizeof(*ports));

...하지만이 라인은 말도 안됩니다. 이것과 동일합니다.

ports[0] = (struct port_t*) calloc(2, sizeof(port_t));

즉. 두 개의 포트에 대한 충분한 메모리를 가리킬 첫 번째 포인터를 설정합니다.

그렇게 작은 것은 10 개의 포트를 만들지 만 모두 사용하지 않는 것이 훨씬 더 합리적입니다.

#define MAX_PORTS 10

struct port_t
{
    int port_id;
    char name;
} ports[MAX_PORTS];

/* number of ports in use */
int numPorts = 0;

int main(void)
{
    numPorts = 3;
    for (int i=0; i<numPorts; i++) {
     ports[i].port_id = i;
     printf("port_id %d: %d\n", i, ports[i].port_id);
    }
    return 0;
}

다른 팁

첫 번째 코드 블록이 있습니다

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

포인터의 배열입니다. 이것은 나중에 당신이 사용할 때를 의미합니다

ports[0]->port_id

배열에서 첫 번째 포인터를 해석하고 있습니다. 당신이 실제로 부르는 것의 크기를 둘러싼 추악함도 있습니다. 실제로 10의 배열을 2의 배열로 대체합니다.

나는 당신의 의도가 다음과 같은 선을 따라 있다고 생각합니다.

struct port_t
{
    int port_id;
    char name;
} *ports;

int main(void)
{
    *ports = (struct port_t*) calloc(2, sizeof(*ports));

    ports[0].port_id = 20;

    printf("port_id: %d\n", ports[0].port_id);

    return 0;
}

C99를 사용하고 있으므로 Calloc ()/malloc (), 당신이 정말로 원한다면 C99의 변수 배열 선언을 사용하여.

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

트릭은 스택에 있기 때문에 해당 함수와 그 기능에서만 유효합니다. 그 기능에서 돌아 오면 물론 해제됩니다.

포트는 Port_t 객체에 대한 포인터와 배열이므로 포트를 수행하면 [0] 객체가 아닌 포인터가 생깁니다. ->로 액세스해야합니다.

C의 포인터에 대한 좋은 자원을 잡고 덮개에서 덮개로 읽으십시오. C 선언을 읽는 것에 대한 자습서도 있습니다. 무작위 질문에 대한 답변을 얻어이 주제를 이해할 수 없습니다.

여기'SA 링크를 읽을 가치가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top