如何声明一个具有包含数组的结构的函数,其大小由argv确定,作为参数?

时间:2016-12-07 07:21:28

标签: c declaration

我的结构dt包含一个内部数组,其大小由argv确定。我需要将此结构提供给函数func,因此我尝试使用void指针参数声明它,但编译器抱怨它在一天结束时没有空。这是代码:

#include <stdio.h>
#include <string.h>

void func(void *);

int main(int argc, char *argv[])
{
    int RETSIZE;
    sscanf(*++argv, "%d", &RETSIZE);
    struct
    {
        char name[6];
        char ret[RETSIZE];
    } dt[100];

    func(dt);
}

void func(void *dt)
{
    dt->ret[2] = 3;
}

我如何以及在何处声明结构dt和函数func以便它可以解决?

3 个答案:

答案 0 :(得分:2)

如果要在两个(或更多)函数中使用结构,则需要在全局范围内定义它,因此两个函数都可以访问它。根本没办法。

对于数组,在这种情况下,不可能使用可变长度数组。您需要使用flexible array member或使用指针。这两者都需要动态分配堆。您还需要将数组中的元素数保留为结构中的成员。

答案 1 :(得分:0)

以下是您的代码的一些更正/评论:   - 将结构保持在全局范围内,以便结构对所有代码都可见。   - 在func void func(void *dt)中,你应该再次输入原始数据类型(在本例中为struct),以便使用它。   - 正如上面的帖子所建议的那样,在C lang中,编译器应该知道数组(字符串)的大小。否则,RETSIZE中会出现一些垃圾值,并且会为ret分配大量的堆栈内存。所以,结构应该是 struct mystruct { char name[6]; char *ret; }; 对于内存分配, dt.ret = (char *)malloc(RETSIZE*sizeof(char));   - 你的func也应该被修改,因为你声明了一个100的结构数组,并且你将它传递给func

答案 2 :(得分:0)

试试这个:

#include <stdio.h>
#include <string.h>

#define MAX_OBJECT 100
typedef struct
{
    char name[6];
    char ret[];
} dt;

void func(dt *strPtr)
{
    strPtr->ret[2] = 3;
}

int main(int argc, char *argv[])
{
    dt obj[MAX_OBJECT];

    func(&obj[0]);

    printf("Verify values written successfully or not: %d \n",obj[0].ret[2]); //Just for example
}