문제
구조물을 사용하고 있으며 최대 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 링크를 읽을 가치가 있습니다.