在C中初始化数组时出错

时间:2015-02-18 05:44:57

标签: 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 c;
}


    int main()
    {

        text_t * create();


        return 0;

    }

我收到错误 - 在']'标记之前的预期表达式。为什么会出现这个错误?不是text []全球声明,我可以在任何地方访问它吗?这个程序有什么问题,我应该如何纠正它。

3 个答案:

答案 0 :(得分:1)

您不能拥有像

这样的数组定义
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的 initalizer list 。您可以在案例中使用第二个,而不是第一个。


编辑2

那就是说,你的create_text()功能是错误的。实际上,您将返回本地变量text的地址。不正确。将调用UB。

答案 1 :(得分:1)

我看到以下问题:

text_t text[];

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

text_t text[100];

该行

text[]="sldk";
两个帐户

错误。

  1. 您无法使用=运算符分配给数组。

  2. 您无法使用text[]来访问该阵列。

  3. 这是您程序的固定版本。

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

答案 2 :(得分:0)

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

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

对这些类型的字符串进行操作的C函数(如strlen计算字符串的长度需要在数组末尾添加'null' or '\0'字符。

使用字符串文字初始化字符数组,例如&#34; test&#34;将自动在末尾插入一个空字符。

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的内置数据类型。

string str;

希望这有帮助