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