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