我的结构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
以便它可以解决?
答案 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
}