在C中初始化数组时出错

在C中初始化数组时出错,c,arrays,initializer-list,C,Arrays,Initializer List,下面是我的代码: #include <stdio.h> #include <stdlib.h> typedef int index_key; typedef char text_t; text_t *create_text() { //text_t text[SIZ]; text_t *c; text_t text[]="fl"; c= text; return

下面是我的代码:

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


    typedef int index_key;  
    typedef char text_t;          

    text_t *create_text()
{
    //text_t text[SIZ];
    text_t *c;
    text_t text[]="fl";
    c= text;
    return c;
}


    int main()
    {

        text_t * create();


        return 0;

    }
#包括
#包括
typedef int index_键;
typedef字符文本;
文本*创建文本()
{
//text_t text[SIZ];
text_t*c;
text_t text[]=“fl”;
c=文本;
返回c;
}
int main()
{
text_t*create();
返回0;
}

我在']'标记之前得到一个错误表达式。为什么会发生这种错误?text[]不是一个全局声明,我可以在任何地方访问它吗?此程序中有什么错误,我应该如何更正它。

您不能有这样的数组定义

text_t text[];
或者指定大小

#define SIZ 256   //arbitary value

text_t text[SIZ];
或者使用初始值设定项

text_t text[] = {`A`, `B`, `C`};

编辑:

根据最新添加的内容,请注意
“sldk”
(如您所用)和
{'s',d',l',k'}
(如我所建议)不一样。前者是字符串文字,而后者是
char
s的初始化列表。您可以在您的案例中使用第二个,而不是第一个


编辑2


也就是说,您的
create\u text()
函数是错误的。实际上,您正在返回局部变量的地址
text
。不对。将调用UB。

我发现以下问题:

text_t text[];
是一种声明,而不是定义。您必须添加一行定义
文本
,例如:

text_t text[100];
text_t *create_text()
{
    text_t *c = malloc(20);
    strcpy(c, "fl");
    return c;
}
线路

text[]="sldk";
有两个原因是错误的

  • 您不能使用
    =
    运算符分配给数组

  • 您不能使用
    text[]
    访问数组

  • 这是你的程序的固定版本

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef int index_key;  
    typedef char text_t;
    
    // This is a forward declaration of the array.
    text_t text[];
    
    text_t *create()
    {
        text_t *c;
    
        // One way to get some string into a char array.
        strcpy(text,"sldk");
    
        c = text;
        return c;
    }
    
    // This is the definition of the array.
    text_t text[100];
    
    int main()
    {
        text_t * create();
        return 0;
    }
    

    <> > C语言没有内置的字符串数据类型,不同于C++、java或C语言。 字符串在C中表示为字符数组。因此C中的任何数组都应该有一定的大小

    int numbers[10];
    char string[50];
    
    对这些类型的字符串(如计算字符串长度的
    strlen
    )进行操作的C函数要求在数组末尾有
    'null'或'\0'
    字符

    使用类似“test”的字符串文本初始化字符数组将自动在末尾插入空字符

    char str[10] = "test";
    characters stored {'t','e','s','t','\0'}
    
    如果使用逗号分隔的字符初始化,则需要显式指定此字符

    char str[10] = {'t','e','s','t', '\0'}; //explicit null character
    
    因此,通常数组大小比要存储的字符串的最大大小大一倍

    char name[MAXLEN+1];
    

    如果使用C++,可以使用内置的数据类型,称为“代码>字符串

    string str;
    

    希望这有帮助

    您不需要指定数组的大小吗?和索引吗?您好,如果我使用text[SIZ]声明。我在text[SIZ]=“sldk”处收到一条警告,说明赋值从指针生成整数,而不使用强制转换[默认情况下启用]。既然指针*c已经是字符类型,这里有什么情况?@Arnold Hint:
    “sldk”
    不是char类型,对吗?@Arnold同样,在初始化时,您不需要显式提供数组大小。将其交给编译器,它会为您完成任务。例如,请参阅我答案中的最后一行。现在清楚了吗?:-)好的,赋值从指针生成整数意味着什么?“sldk”不是字符,但也不是整数,@Arnold通过指针生成整数,是
    “sdlk”
    有效地给出了字符串literalHello的起始地址指针,很好的解释。谢谢。您说过我不能使用=运算符将其分配给数组。如果我删除全局定义并使用text_t*create_text(){//text_t text[SIZ];text_t*c;text_t text[]=“fl”;c=text;return c;}