Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将具有包含数组的结构(其大小由argv确定)的函数声明为参数?_C_Declaration - Fatal编程技术网

C 如何将具有包含数组的结构(其大小由argv确定)的函数声明为参数?

C 如何将具有包含数组的结构(其大小由argv确定)的函数声明为参数?,c,declaration,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",

我有一个结构
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;
}
#包括
#包括
无效函数(无效*);
int main(int argc,char*argv[])
{
整数大小;
sscanf(*++argv、%d、&RETSIZE);
结构
{
字符名[6];
char-ret[RETSIZE];
}dt[100];
func(dt);
}
void func(void*dt)
{
dt->ret[2]=3;
}

如何以及在何处声明结构
dt
和函数
func
,以使其生效?

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


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

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


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

以下是代码的一些更正/注释: -将结构保持在全局范围内,以便整个代码都可以看到该结构。 -在func
void func(void*dt)
中,为了使用它,您应该再次将其类型转换为原始数据类型(本例中为struct)。 -正如上面文章所建议的,在C语言中,编译器应该知道数组(字符串)的大小。否则,
RETSIZE
中会出现一些垃圾值,并且会将大量堆栈内存分配给
ret
。因此,结构应该是
struct mystruct
{
字符名[6];
char*ret;
};
对于内存分配,
dt.ret=(char*)malloc(RETSIZE*sizeof(char))

-另外,您的
func
也应该被修改,因为您已经声明了一个100的结构数组,并且正在将它传递给
func

,下面是一些代码的更正/注释: -将结构保持在全局范围内,以便整个代码都可以看到该结构。 -在func
void func(void*dt)
中,为了使用它,您应该再次将其类型转换为原始数据类型(本例中为struct)。 -正如上面文章所建议的,在C语言中,编译器应该知道数组(字符串)的大小。否则,
RETSIZE
中会出现一些垃圾值,并且会将大量堆栈内存分配给
ret
。因此,结构应该是
struct mystruct
{
字符名[6];
char*ret;
};
对于内存分配,
dt.ret=(char*)malloc(RETSIZE*sizeof(char))
-另外,您的
func
应该被修改,因为您已经声明了一个100的结构数组,并且正在将其传递给
func
尝试以下操作:

#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
}
#包括
#包括
#定义MAX_对象100
类型定义结构
{
字符名[6];
char-ret[];
}dt;
无效函数(dt*strPtr)
{
strprtr->ret[2]=3;
}
int main(int argc,char*argv[])
{
dt obj[MAX_OBJECT];
func(&obj[0]);
printf(“验证是否成功写入值:%d\n”,obj[0].ret[2]);//仅举个例子
}
试试这个:

#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
}
#包括
#包括
#定义MAX_对象100
类型定义结构
{
字符名[6];
char-ret[];
}dt;
无效函数(dt*strPtr)
{
strprtr->ret[2]=3;
}
int main(int argc,char*argv[])
{
dt obj[MAX_OBJECT];
func(&obj[0]);
printf(“验证是否成功写入值:%d\n”,obj[0].ret[2]);//仅举个例子
}

您需要阵列吗?使用指针会让你的生活更轻松。@SouravGhosh这个短语适合的地方很少(考虑到使用指针几乎不会让人的生活更轻松),但这似乎是其中之一@某位编程人员说得对,先生,这里似乎是灵活的数组成员
malloc
是您的朋友。您需要阵列吗?使用指针会让你的生活更轻松。@SouravGhosh这个短语适合的地方很少(考虑到使用指针几乎不会让人的生活更轻松),但这似乎是其中之一@某位编程人员说得对,先生,这里似乎是灵活的数组成员
malloc
是您的朋友。实际上,我甚至不需要将结构作为参数传递,因为它是在全局范围内声明的。它自然对函数可用。实际上,我甚至不需要将结构作为参数传递,因为它是在全局范围内声明的。它自然对函数可用