C中数组初始化错误

Error in initializing array in C

下面是我的代码:

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

    }

我收到一个错误 - 在“]”标记之前需要表达式。为什么会出现此错误? 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 。您可以在您的情况下使用第二个,而不是第一个。


编辑 2

就是说,您的 create_text() 函数是错误的。实际上,您返回的是局部变量 text 的地址。不正确。将调用 UB。

我看到以下问题:

text_t text[];

是声明,不是定义。您必须添加定义 text 的行,例如:

text_t text[100];

text[]="sldk";

两个账户都错了。

  1. 您不能使用 = 运算符给数组赋值。

  2. 您不能使用 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;
}

更新

关于您更新的 create_text 函数...

它应该可以工作,因为字符串文字存储在程序的只读内存中。一旦您尝试更改其中的任何内容,它就会导致问题。最好使用更安全的方法,例如:

text_t *create_text()
{
    text_t *c = malloc(20);
    strcpy(c, "fl");
    return c;
}

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

int numbers[10];
char string[50];

对这些类型的字符串进行操作的 C 函数(如计算字符串长度的 strlen 需要在数组末尾有一个 'null' or '[=16=]' 字符。

用像 "test" 这样的字符串文字初始化字符数组会自动在末尾插入一个空字符。

char str[10] = "test";
characters stored {'t','e','s','t','[=11=]'}

如果你用逗号分隔的字符初始化它,你需要明确指定这个字符。

char str[10] = {'t','e','s','t', '[=12=]'}; //explicit null character

因此,数组大小通常比要存储的字符串的最大大小大一。所以像下面这样的声明是很常见的。

char name[MAXLEN+1];

如果您使用的是 C++,则可以使用名为 string 的内置数据类型。

string str;

希望对您有所帮助