2014-03-05 63 views
0

我试图创建一个具有char指针数组作为其成员之一的结构,并且在试图设置/访问数组元素时遇到了问题。每个字符指针将指向一个malloc'd缓冲区。这是目前的结构。处理指针数组

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

当我尝试通过

char *buffer = malloc(100); 

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

访问缓存的元素,我得到错误“无效的数组的使用未指定边界”。我不知道阵列的大小是多少,所以我不能硬编码它的大小。 (我试过取​​消引用缓冲区[0],并添加第二个索引?我觉得好像它是一个语法错误我在做)

回答

0
char (*buffers)[SIZE]; 

声明buffers作为一个指针数组char不数组的指针。我认为你需要这个

char *buffers[SIZE]; 

注:灵活的数组成员可以使用,只有当它是结构的最后一个成员。

+0

如果我不知道是什么数组的大小?这将取决于投入。 – Danzo

+0

如果您使用的是灵活的数组成员,那么它必须是最后一个成员,并且在使用它之前需要分配空间,取决于您的输入。 – haccks

+0

为什么你需要它是最后一个成员?我认为这不是必需的......这只是一个指针。 – ThoAppelsin

2

不能像没有大小那样拥有数组,就像错误信息所说的那样,至少不在结构的中间。在你的情况下,你可能会考虑指向指向char的指针?然后你可以使用例如初始阵列为malloc,需要时为realloc

喜欢的东西

char **buffers; 

然后做

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

然后你可以使用buffers像指针的 “正常” 的数组:

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

优秀的建议,谢谢! – Danzo

+0

请原谅,'struct rt_args'的声明是完全有效的。 – alk

+0

@alk不具有灵活的数组(不带大小的数组)。那些必须放置在结构的最后,所以当不是最后时,结构是无效的。 –