可变大小的对象可能未初始化 - 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; 
} 
+4

'return nome;' - 不。你不能这样做。 –

+1

你的代码有多个问题,你想要做什么? –

+1

您正在返回'lenomes'中'char'的指针,其中'int'作为返回类型。你声明了两次'nomes'(一次在'main'的开头,另一次在循环中)。 – ForceBru

首先功能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]); 
} 
+0

_但是,请注意函数'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 */ 
}