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";
两个账户都错了。
您不能使用 =
运算符给数组赋值。
您不能使用 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;
希望对您有所帮助
下面是我的代码:
#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";
两个账户都错了。
您不能使用
=
运算符给数组赋值。您不能使用
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;
希望对您有所帮助