2014-03-05 2 views
0

char 포인터 배열을 구성원 중 하나로 갖고 있으며 배열 요소를 설정/액세스하는 데 문제가있는 구조체를 만들려고합니다. 각 char 포인터는 malloc 된 버퍼를 가리킬 것입니다. 이것은 현재 구조체입니다. 내가포인터 배열 처리

char *buffer = malloc(100); 

struct rt_args (*rThreadArgs) = malloc(sizeof(long) + 
             (sizeof(char *) * (numThreads)) + 
             sizeof(FILE*) 
           ); 
rThreadArgs->buffers[0] = buffer; 

를 통해 버퍼의 요소에 액세스 할 때

struct rt_args { 
    long threadId; 
    char (*buffers)[]; 
    FILE* threadFP; 
}; 

는 그리고 "지정되지 않은 경계를 가지는 배열의 잘못된 사용"오류를 얻을. 배열의 크기를 미리 알지 못하기 때문에 크기를 하드 코딩 할 수 없습니다. (I 해봤 드 참조 버퍼 [0]와 두 번째 인덱스 추가? 나는 그것의 문법적 오류 내가 만들고있어 것처럼 기분이)

답변

0
char (*buffers)[SIZE]; 

char 배열이 아닌 배열에 대한 포인터로 buffers 선언 포인터의. 난 당신이

char *buffers[SIZE]; 

주의가 필요하다고 생각 :이 구조체의 마지막 멤버 인 경우에만유연한 배열 구성원이 사용할 수 있습니다.

+0

내가 무엇을 모르는 경우 :

char **buffers; 

그런 다음

buffers = malloc(sizeof(buffers[0]) * number_of_pointers_needed); 

는 그런 다음 포인터의 "정상적인"배열과 같은 buffers을 사용할 수 있습니다 할

뭔가처럼 배열의 크기? 입력에 따라 다릅니다. – Danzo

+0

플렉시블 배열 멤버를 사용하는 경우 마지막 멤버 여야하며 사용하기 전에 입력에 따라 공간을 할당해야합니다. – haccks

+0

마지막 멤버가되기 위해 정확히 필요한 이유는 무엇입니까? 나는 그것이 필요할 것이라고 생각하지 않는다. 그것은 단지 포인터 일 뿐이다. – ThoAppelsin

2

크기가없는 배열을 사용할 수 없습니다. 오류 메시지와 마찬가지로 적어도 구조의 중간에는 n이 없습니다. 귀하의 경우에는 char에 대한 포인터에 대한 포인터를 생각할 수 있습니까? 그런 다음 예를 들어 초기 배열은 malloc이고 필요하면 realloc입니다.

buffers[0] = malloc(length_of_string + 1); 
strcpy(buffers[0], some_string); 
+0

훌륭한 조언, 감사합니다! – Danzo

+0

'struct rt_args'의 선언은 완벽하게 유효합니다. – alk

+0

@alk 유연한 배열 (크기가없는 배열)이 아닙니다. 그것들은 구조체의 마지막에 놓여 져야합니다. 그래서 마지막 구조체가 아닌 경우 구조체가 유효하지 않습니다. –