char ** r; r = (char **) malloc (10);이중 포인트 메모리 할당
위의 할당으로 충분합니까? 내가 char * r에 대한 루프를 통해 할당 할 필요가 없습니까? 모든 올바른 설명 할 수 있습니까?
char ** r; r = (char **) malloc (10);이중 포인트 메모리 할당
위의 할당으로 충분합니까? 내가 char * r에 대한 루프를 통해 할당 할 필요가 없습니까? 모든 올바른 설명 할 수 있습니까?
10 개의 char 포인터를 할당한다고 가정하면이 방법은 작동하지 않습니다. 대신 10 바이트의 메모리를 할당합니다.
char 포인터는 2 바이트 이상일 수 있습니다. 다행히 컴파일러가 실제 크기를 알고 있기를 바랍니다.
char** r = (char**)malloc(sizeof (char*) * 10);
이렇게하면 10 개의 char 포인터에 충분한 공간이 할당됩니다. 그러나 현재 그들은 아무데도 유용하지 않다고 지적합니다.
이렇게하면 20 개의 할당 된 메모리를 가리키는 10 개의 char 포인터가 생깁니다.
은 (거기는 sizeof(char)
것이기 때문에 여기 반군 sizeof
없고, sizeof(char)
은 1로 정의된다)
작은 점 : C에서는 malloc의 결과를 캐스팅하지 않는 것이 좋습니다 (이 작업은 C++하지만 C에서는 필요하지 않으므로 생략해야합니다. 그렇게하지 않으면 유용한 컴파일러 경고가 표시되지 않습니다. –
더 나은 스타일은 char ** r = malloc (sizeof (* r) * 10); – Nyan
가장 확실하게 잘못되었습니다. char*
은 대부분의 아키텍처에서 10을 나눈 크기가 아닙니다. 이제 r
의 각 요소는이 char*
을 할당 어딘가에 가리키는 데 사용 될 수있다
char** r;
// Allocate an array of 10 char* in r
r = (char**)malloc(10 * sizeof(*r));
:
는 여기에 몇 가지 예제 코드입니다.
위의 코드에서 저는 (사용자가 한 것처럼) malloc
의 결과를 캐스팅했습니다. 이것은이 코드가 캐스트가 필요없는 C 컴파일러가 아닌 C++ 컴파일러로 컴파일 된 경우에만 필요합니다. OTOH, C++에서는 이 아니라 new
이 필요합니다.
sizeof * r을 사용하는 경우 +1 –
숯불이 ** R은 문자 포인터에 대한 포인터입니다. 그것은 문자열의 배열로 볼 수 있습니다. 배열의 모든 메모리를 초기화하려면,
r = (char **)malloc(sizeof(char *) * NUMBER_OF_ELEMENTS_OF_ARRAY);
for (i = 0; i < NUMBER_OF_ELEMENTS_OF_ARRAY; i++) {
r[i] = (char *)malloc(sizeof(char) * LENGTH_YOU_WANT_STRING);
}
또는 이와 비슷한 것을 사용해야합니다.
당신이 원하는 방법으로 "2 차원"구조에 대한 메모리를 할당하는 간단한 방법은 다음과 같습니다
#include <stdlib.h> /* for malloc() */
char **r;
/* we will allocate 'size' values, each of 'data_size' length */
size_t size = 10;
size_t data_size = 42;
size_t i;
/* allocate 'size' objects of the right type.
*
* Notes:
*
* 1. no casting the return value of malloc(),
* 2. r = malloc(size * sizeof *r) is type-agnostic, so
if you change the type of r, you don't need to remember
to change the malloc() call */
r = malloc(size * sizeof *r);
/* Error check omitted for clarity. In real code, always check for return
value of malloc() */
for (i=0; i < size; ++i) {
/* once again, no cast, and we use x = malloc(size * sizeof *x) idiom */
r[i] = malloc(data_size * sizeof *r[i]);
}
위 기법의 장점은 3, 4에 대한 최소한의 노력으로 작동한다는 것입니다 - 또는 더 높은 차원을 가지며 읽기 쉽습니다.
위의 코드에서 sizeof(char)
이 1이되도록 보장 되었기 때문에 malloc(data_size * sizeof *r[i])
대신 malloc(data_size)
을 쓸 수 있었지만, 다시 말하면 유형 위주이므로이 양식을 선호합니다.
위의 할당으로 충분합니까? 거의 정확하지 않습니다 (2 ~ 5 바이트 포인터가있는 이상한 시스템이 아니라면 ...). C 책을 참고하십시오. C 책이 없으면 책을 가져 오는 것이 좋습니다. 좋은 책 목록을 [The Definitive C Book Guide and List] (http : // stackoverflow.)에서 찾을 수 있습니다.com/questions/562303/the-definitive-c-book-guide-and-list) –