처음보다 더 무서워 보이는 모든 것과 마찬가지로, 초기 두려움을 극복하는 가장 좋은 방법은 자신을 미지의 불쾌에 빠뜨리는 것입니다 ! 결국 우리가 가장 많이 배우는 것과 같은 시간입니다.
불행히도 한계가 있습니다. 여전히 기능 사용을 배우는 동안 예를 들어 교사의 역할을 맡아서는 안됩니다. 나는 종종 겉으로 사용하는 방법을 알고하지 않는 답변을 읽고 realloc
(즉, 현재 허용 대답! ) 때때로 그들이 한 것으로 가장하여, 잘못을 사용하는 방법을 다른 사람을 말하는 오류 처리 생략 이 일반적인 함정에도 불구하고, 언급이 필요합니다. 올바르게 사용하는 방법을 설명하는 답변이 있습니다realloc
. 답은 오류 검사를 수행하기 위해 반환 값을 다른 변수에 저장한다는 것입니다 .
함수를 호출 할 때마다 그리고 배열을 사용할 때마다 포인터를 사용합니다. 변환이 암묵적으로 발생하고 있는데, 어떤 것이 더 무서워 야한다면, 가장 큰 문제를 일으키는 것은 우리가 보지 못하는 것들이기 때문입니다. 예를 들어, 메모리 누수 ...
배열 연산자는 포인터 연산자입니다. array[x]
에 대한 바로 가기이며 *(array + x)
다음 *
과 같이 나눌 수 있습니다 (array + x)
. 이것이 *
당신을 혼란스럽게 할 가능성이 높습니다 . 우리는 더 가정에 의한 문제에서 또한 제거 할 수 x
수를 0
, 따라서 array[0]
이된다 *array
추가하기 때문에 0
값을 변경하지 않습니다 ...
... 따라서 우리 *array
는 이것과 같다는 것을 알 수 있습니다 array[0]
. 다른 것을 사용하려는 곳을 사용할 수 있으며 그 반대도 가능합니다. 배열 연산자는 포인터 연산자입니다.
malloc
, realloc
친구가없는 발명 은 모두 함께 사용하고 포인터의 개념을; 그들은 단지 다른 기능을 구현 하기 위해 이것을 사용하는데 , 이것은 다른 형태의 저장 시간이며, 크기가 급격하고 역동적으로 변화하기 를 원할 때 가장 적합 합니다 .
현재 받아 들여진 대답 이 StackOverflow에 대한 다른 잘 알려진 조언에 위배되는 동시에 부끄러운 일이지만 동시에이 유스 케이스에 빛나는 거의 알려지지 않은 기능을 소개 할 기회가 없습니다 : 유연한 배열 회원! 그것은 실제로 꽤 깨진 대답입니다 ... :(
를 정의 할 때 구조체 의 끝 에서 상한없이 struct
배열 을 선언하십시오 . 예를 들면 다음과 같습니다.
struct int_list {
size_t size;
int value[];
};
이렇게하면 배열을와 int
같은 할당으로 통합 할 count
수 있으며 이와 같이 묶는 것이 매우 편리합니다 !
sizeof (struct int_list)
value
크기가 0 인 것처럼 작동 하므로 빈 목록을 가진 구조의 크기를 알려줍니다 . realloc
목록의 크기를 지정하려면 전달 된 크기에 여전히 추가 해야합니다.
또 다른 유용한 팁은이 내용이에 해당함을 기억하는 것 realloc(NULL, x)
입니다 malloc(x)
.이 코드를 사용하여 코드를 단순화 할 수 있습니다. 예를 들면 다음과 같습니다.
int push_back(struct int_list **fubar, int value) {
size_t x = *fubar ? fubar[0]->size : 0
, y = x + 1;
if ((x & y) == 0) {
void *temp = realloc(*fubar, sizeof **fubar
+ (x + y) * sizeof fubar[0]->value[0]);
if (!temp) { return 1; }
*fubar = temp; // or, if you like, `fubar[0] = temp;`
}
fubar[0]->value[x] = value;
fubar[0]->size = y;
return 0;
}
struct int_list *array = NULL;
struct int_list **
첫 번째 인수 로 사용하기 로 선택한 이유 는 즉시 명백하지 않을 수도 있지만 두 번째 인수에 대해 생각하면 value
내부에서 변경 한 내용 push_back
이 호출 한 함수에 표시되지 않습니다. 동일은 첫 번째 인수에 간다, 우리는 우리 수정할 수 있어야 array
뿐만 아니라, 여기에 있지만 다른 기능도 가능하게 / 우리는 그것을 통과 s의 ...
array
아무것도 가리 키지 않고 시작합니다. 빈 목록입니다. 초기화 하는 것은 추가하는 것과 같습니다. 예를 들면 다음과 같습니다.
struct int_list *array = NULL;
if (!push_back(&array, 42)) {
// success!
}
추신 당신이 그것으로 끝났을 때를 기억하십시오free(array);
!