2017-02-27 2 views
0

이것은 간단한 질문과 대답 일 수도 있지만 적절한 해결책을 가지고 이와 비슷한 것을 찾지는 못합니다. 두 개의 변수를 가진 C에서 struct을 만들고 다음에 struct을 만드는 데 사용 된 두 개의 변수 매개 변수와 동일한 크기의 2 차원 배열을 만들려고합니다. C 구조체의 가변 2D 배열

struct image{ 
    int width; 
    int hight; 
    int pixles[width][height]; 
}; 

지금 나는 심지어 그것을 컴파일하지만 난이 일을 가야하는 방법을 잘 모르겠어요 전에이 작동하지 않을 알고 있었다.

+0

를 사용하여 1 차원 배열, 2 단계 할당에 대한 포인터. – Olaf

+1

이것은 불가능합니다. 구조체의 크기는 컴파일시 알려 져야합니다. –

+0

참조 : http://stackoverflow.com/questions/5170525/array-in-c-struct – kr1tzb1tz

답변

0

의견에서 말한대로 바로 수행 할 수 없습니다. 에 두 가지 일반적인 숙어가 (VLA 지원되는 가정)을 시뮬레이션 할 수 있습니다 :

  1. 당신이 (동적으로 할당) 배열에 대한 포인터, 당신은 2 차원에 대한 포인터로 구조체 만 저장 캐스팅 VLA 배열 : 동적으로 구조체를 할당 할 경우 (A VLA 포인터를 다시 캐스팅)의 마지막 요소로서 0 크기의 배열을 사용할 수 있습니다

    typedef struct _Image { 
        int width; 
        int height; 
        unsigned char * data; 
    } Image; 
    
    int main() { 
    
        Image image = {5, 4}; 
    
        image.data = malloc(image.width * image.height); 
        unsigned char (*data)[image.width] = (void *) image.data; 
        // you can then use data[i][j]; 
    
  2. :

    typedef struct _Image { 
        int width; 
        int height; 
        unsigned char data[0]; 
    } Image; 
    
    int main() { 
        Image *image = malloc(sizeof(Image) + 5 * 4); // static + dynamic parts 
        image->width = 5; 
        image->height = 4; 
        unsigned char (*data)[image->width] = (void *) &image->data; 
        // you can then safely use data[i][j] 
    
  3. VLA 당신의 C 구현을 지원하지 않는 경우

, 당신은 1D 포인터를 통해 2 차원 배열을 시뮬레이션 이전 관용구로 복귀해야합니다 data[i + j*image.width]