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

时间:2016-03-08 13:42:08

标签: c

我试图运行代码,但它无法构建。我想读取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;
}

3 个答案:

答案 0 :(得分:0)

首先,函数lenomes包含无意义的代码,不会编译。您无法从函数返回数组。并且您还没有声明函数返回数组,您已声明它返回int。你告诉我,这有多大意义。

  char 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]);
}

答案 1 :(得分:0)

在本声明中

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类型的指针,该指针具有退出函数后将被销毁的本地数组的第一个元素的地址。

考虑到C标准不再支持函数gets,因为它不安全。

您需要以下内容

#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;
}

答案 2 :(得分:0)

在显示代码中存在问题的注释的帮助下,这是一个可能的实现。

#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 */
}