2012-01-29 3 views
1

포인트 (x, y)의 배열을 저장해야합니다. 파일에서 포인트를 읽었고 포인트의 수는 일정하지 않지만 파일의 첫 번째 라인에서 얻을 수 있습니다. 그래서 파일에서 포인트를로드하고 전역 배열에 저장하는 프로 시저 load()를 작성합니다. 작동하지 않습니다. 내 코드 :런타임에 정수의 전역 2 차원 C 배열을 초기화하십시오.

int *array[][]; // this is a pointer to a 2-dimensional array?? 

void load(){ 
.. 
int tempArray[2][n]; //n is the first line of the file 
.. 
array = tempArray; 
} 

답변

3

당신은 변수를 정의 함수에 로컬 메모리에 대한 포인터를 반환하려는. 일단 그 함수가 실행을 멈 추면 ("범위를 벗어남"), 그 메모리는 다른 것을 위해 다시 사용되기 때문에 나중에 참조하고 사용하는 것은 불법입니다.

동적 할당을 살펴보고로드 함수가 필요한 메모리를 할당하고 반환하도록해야합니다.

함수 프로토 타입이 될 수있다 : filename 파일의 이름을 엽니 물론이다

int * read_points(const char *filename, size_t *num_points); 

, num_points가 발견 점의 수와 반환 값으로 설정 배열에 대한 포인터입니다 인터리브 된 x 및 y 값 보유. 그래서이로드 첫 번째 점의 좌표를 인쇄 할 것이다 :

size_t num_points; 
int *points; 

if((points = load_points("my_points.txt", &num_points)) != NULL) 
{ 
    if(num_points > 0) 
    printf("the first point is (%d,%d)\n", points[0], points[1]); 
    free(points); 
} 
0

더 우아한 버전은 다음과 같이 갈 수 있습니다 당신은 배열하지만 C 배열에 할당 할 수 없습니다를 할당하려고

typedef struct point_ { int x; int y; } point; 

point * create_array(size_t n) 
{ 
    return calloc(n, sizeof(point)); 
} 

void free_array(point * p) 
{ 
    free(p); 
} 

int main() 
{ 
    size_t len = read_number_from_file(); 
    point * data = create_array(len); 

    if (!data) { panic_and_die(); } 

    for (size_t i = 0; i != len; ++i) 
    { 
     /* manipulate data[i].x and data[i].y */ 
    } 

    free_array(data); 
    data = 0;   /* some people like to do this */ 
} 
0

.

하나의 어레이를 다른 어레이에 복사하려면 memcpy을 사용하십시오. C의 배열 요소는 인접한 것이 보장됩니다.

int bla[N][M] = {0}; 
int blop[N][M]; 

/* Copy bla array to blop */ 
memcpy(blop, bla, sizeof blop); 
2

당신의이 선언은 작동하지 않습니다

int *array[][]; // this is a pointer to a 2-dimensional array?? 

첫째, int *의 2 차원 배열을 선언하기 위해 노력하고있다. 둘째, 배열을 선언하거나 정의 할 때 첫 번째 배열을 제외한 모든 차원을 지정 (크기 지정)해야합니다.

int (*array)[][2]; // This is a pointer to a 2D array of unknown size 

이제는 기능의 주요 변형에 사용할 수 있습니다. 처음에는 질문을 잘못 읽었 기 때문에 변형 된 것입니다.

void load(void) 
{ 
    ... 
    int tempArray[n][2]; // Note the reversed order of dimensions! 
    ... 
    array = &tempArray; 
    ...there must be some code here calling functions that use array... 
    array = 0; 
} 

배열 이름에 &이 필요합니다. 다른 함수에서는 다음과 같이 작성해야합니다.

전역 배열에 주소를 할당하는 것은 위험합니다. load() 함수가 반환되면 tempArray의 저장 공간은 더 이상 유효하지 않습니다. 따라서 할당을 수행하는 유일한 안전한 방법은 전역 변수를 참조하는 함수를 호출 한 다음 함수를 종료하기 전에 전역 변수를 재설정하는 것입니다. (또는 적어도 값이 유효하지 않음을 인식하지만 null 포인터를 0으로 설정하면 임의의 메모리에 액세스하는 것보다 프로그램이 충돌하지 않게됩니다.

또는 배열에 대한 동적 메모리 할당.

귀하의 질문은 실제로 변수 차원이 처음이 아닌 VLA, 가변 길이 배열에 글로벌 포인터를 확인하고자한다

:

int tempArray[2][n]; // Note the reversed order of dimensions! 

당신은 단순히에 글로벌 포인터를 만들 수 없습니다 배열.

그래서, 여러 문제가 있습니다 : 당신은 멀티하는 글로벌 포인터를 가질 수 없습니다

  • 는 지역 변수에 글로벌 포인터를 할당 배열에 대한 포인터를 초기화
  • 을 배열에 대한 포인터에 대한

    • 표기법 가변 길이가 첫 번째 차원에없는 차원 VLA.
    • 전역의 사용을 최소화해야합니다.
  • 관련 문제