Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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错误_C - Fatal编程技术网

可变大小的对象可能未初始化-C错误

可变大小的对象可能未初始化-C错误,c,C,我正在尝试运行代码,但它无法生成。我想读3个不同的名字,每个最多40个字符,保存在一个向量中并打印出来。我需要用函数来做。我得到了第15行的“可变大小的对象可能未初始化”。我相信如果向量的大小没有定义,我会得到这个错误。我已经尝试使用常量(NOMESQUAN和NOMESTAM)和声明(nomes[3][41])来定义它,但每次都会遇到相同的错误 #include <stdio.h> #include <stdlib.h> #define NOMESQUAN 3 #def

我正在尝试运行代码,但它无法生成。我想读3个不同的名字,每个最多40个字符,保存在一个向量中并打印出来。我需要用函数来做。我得到了第15行的“可变大小的对象可能未初始化”。我相信如果向量的大小没有定义,我会得到这个错误。我已经尝试使用常量(NOMESQUAN和NOMESTAM)和声明(nomes[3][41])来定义它,但每次都会遇到相同的错误

#include <stdio.h>
#include <stdlib.h>

#define NOMESQUAN 3
#define NOMESTAM 41

int lenomes(int i);

int main()
{
    int i;
    char nomes[NOMESQUAN][NOMESTAM];

    for(i=0; i<3; i++){
         char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/
    }

}

int lenomes(int i){
    char nome[NOMESTAM];

    printf("Digite o nome %d", i);
    gets(nome);

    return nome;
}
#包括
#包括
#定义NOMESQUAN 3
#定义术语表41
内联透镜组(内联Ⅰ);
int main()
{
int i;
char nomes[NOMESQUAN][NOMESTAM];

for(i=0;i首先,函数
lenomes
包含无意义的代码,不会编译。你不能从函数返回数组。你也没有声明函数返回数组,你已经声明它返回
int
。你告诉我这有什么意义


char nomes[NOMESQUAN][NOMESTAM]

printf("Digite o nome %d", i);
gets(nome);

return nome;
这里您声明了一个数组,但在循环中您再次声明了另一个数组
char nomes[i][NOMESTAM]
,但这次是一个可变长度数组(因为
i
是一个运行时变量)。这样的数组无法初始化,因为只有在运行时获取值才有意义


总而言之,在编程时,你不能仅仅抓住语言语法的机会,你实际上必须知道你写的每一行都做了什么

您可能希望执行类似的操作:

#include <stdio.h>
#include <stdlib.h>

#define NOMESQUAN 3
#define NOMESTAM 41

void lenomes (int i, char nomes[i][NOMESTAM]);

int main()
{
    int i;
    char nomes[NOMESQUAN][NOMESTAM];

    for(i=0; i<NOMESQUAN; i++){
         lenomes(i, nomes);
    }

}

void lenomes (int i, char nomes[i][NOMESTAM]) {
    printf("Digite o nome %d", i);
    gets(nome[i]);
}
#包括
#包括
#定义NOMESQUAN 3
#定义术语表41
void lenomes(int i,char nomes[i][NOMESTAM]);
int main()
{
int i;
char nomes[NOMESQUAN][NOMESTAM];
对于本声明中的(i=0;i)

char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/
定义了一个试图初始化的可变长度数组。首先,VLA可能不会被初始化,并且在任何情况下,初始化过程中发生的更多错误

函数
lenomes
也无效

内联透镜组(内联i){ char nome[NOMESTAM]

printf("Digite o nome %d", i);
gets(nome);

return nome;
}

它尝试返回一个转换为int类型的指针,该指针具有本地数组的第一个元素的地址,该元素在退出函数后将被销毁

考虑到C标准不再支持函数
get
,因为它是不安全的

你需要像下面这样的东西

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

#define NOMESQUAN 3
#define NOMESTAM 41

char * lenomes( char *nome, size_t n );

int main( void )
{
    size_t i;
    char nomes[NOMESQUAN][NOMESTAM];

    for ( i = 0; i < sizeof( nomes ) / sizeof( *nomes ); i++ )
    {
         lenomes( nomes[i], sizeof( nomes[i] ) );
    }
}

char * lenomes( char *nome, size_t n )
{
    char *p;

    printf( "Digite o nome " );
    p = fgets( nome, n, stdin );

    if ( p ) p[strcspn( p, "\n" )] = '\0'; 

    return p;
}
#包括
#包括
#包括
#定义NOMESQUAN 3
#定义术语表41
char*lenomes(char*nome,size\u t n);
内部主(空)
{
尺寸i;
char nomes[NOMESQUAN][NOMESTAM];
对于(i=0;i
在说明代码中问题的注释的帮助下,下面是一个可能的实现

#include <stdio.h>   /* io functions MUST be declared */

#define NOMESQUAN 3
#define NOMESTAM 41

/* pass a buffer and a length to io routine */
char *lenomes(int i, char *buf, int sz);

int main()
{
    int i;
    char nomes[NOMESQUAN][NOMESTAM];

    for(i=0; i<3; i++){
         lenomes(i, nomes[i], NOMESTAM); /*LINE 15*/
    }

}

char* lenomes(int i, char *nome, int sz){

    printf("Digite o nome %d", i);
    return fgets(nome, sz, stdin);  /* NEVER use gets */
}
必须声明包含/*io函数*/ #定义NOMESQUAN 3 #定义术语表41 /*将缓冲区和长度传递给io例程*/ char*lenomes(int i,char*buf,int sz); int main() { int i; char nomes[NOMESQUAN][NOMESTAM];
对于(i=0;i'return nome;'-不。您不能这样做。您的代码有多个问题,您想做什么?您在
lenomes
中返回一个指向
char
的指针,该指针的返回类型为
int
。您声明
nomes
两次(一次在
main
的开头,第二次在循环中)。此处没有
向量
或类似向量的结构,已删除标记。您可能指的是“数组”?
字符名称[i][NOMESTAM]=…
是一个变量定义。您可能希望删除
字符
。但是,这将揭示其他问题。但是,请注意,函数
get
已从C语言中删除。注意,该函数在大约25年前使用时本质上是危险的,因此在17年前被淘汰,并且所以无论是谁教你使用它都不是学习C编程的好来源,他们的知识已经完全过时了。