可变大小的对象可能未初始化 - C错误
我试图运行一个代码,但它无法生成。我想读取3个不同的名称,每个名称最多40个字符,保存在一个矢量中并打印出来。我需要使用函数来完成它。我收到第15行的“可变大小的对象可能未初始化”。我相信,如果未定义向量的大小,我可能会得到此错误。我已经尝试过使用常量(NOMESQUAN和NOMESTAM)和声明(nomes [3] [41])来定义它,但每次都得到相同的错误。可变大小的对象可能未初始化 - C错误
#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;
}
首先功能lenomes
包含无意义的代码,并且不会编译。您不能从函数返回数组。而且你还没有声明函数返回一个数组,你已经声明它返回一个int
。你告诉我,这是如何有道理的。
炭nomes [NOMESQUAN] [NOMESTAM];
这里声明数组,但随后的循环内再次声明另一个数组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]);
}
_但是,请注意函数'gets'已经从C语言中删除。据指出,该功能在25年前使用时本质上是危险的,因此17年前已经过时并在5年前完全移除。所以教你使用它的人不是学习C编程的好资源,他们的知识已经完全过时了。 – Lundin
在这份声明中
char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/
有定义试图初始化变量长度数组。首先VLA可能无法初始化,并且在任何情况下初始化都不正确。
功能lenomes
也是无效的。
int lenomes(int i){ char nome [NOMESTAM];
printf("Digite o nome %d", i);
gets(nome);
return nome;
}
它试图返回一个指针转换为类型,其具有将在退出功能后销毁本地阵列的第一元素的地址int值。
考虑到功能gets
不再受C标准支持,因为它不安全。
你需要的东西像下面
#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;
}
随着评论认为表现在你的代码中的问题的帮助,这里是一个可能的实现。
#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 */
}
'return nome;' - 不。你不能这样做。 –
你的代码有多个问题,你想要做什么? –
您正在返回'lenomes'中'char'的指针,其中'int'作为返回类型。你声明了两次'nomes'(一次在'main'的开头,另一次在循环中)。 – ForceBru