你好我是这个网站的新手,我需要一些帮助来理解在C语言中编码需要字符串的结构时会被视为“规范”的内容。基本上我想知道在使用C中的结构来跟踪结构所需的所有内存时,下列哪种方式将被视为“行业标准”:
1)固定大小字符串:
typedef struct
{
int damage;
char name[40];
} Item;
我现在可以使用sizeof(Item)
2)字符数组指针
typedef struct
{
int damage;
char *name;
} Item;
我知道我可以使用第二个变量存储name
的大小,但还有其他方法吗?
i)使用固定大小(1)
还有其他优势吗?char name[40];
与执行以下操作并使用指向char数组的指针(2)?
char *name;
如果是的话,有什么好处?
ii)另外,使用指向char数组(2)的指针的字符串是否会顺序存储在结构之后(紧跟在指向字符串的指针之后),还是存储在内存中的其他位置? / p>
iii)我想知道如何找到char *
字符串变量的长度(不使用size_t
或整数值来存储长度)
答案 0 :(得分:6)
字符串基本上有3种常见约定。所有这三个都是在野外发现的,包括内存表示和存储/传输。
在第三种情况下,有strlen
之类的函数来搜索终结符并找到长度。
使用指针的两种情况都可以指向紧跟在结构的固定部分之后的数据,如果你仔细地分配它。如果要强制执行此操作,请在结构末尾使用灵活数组(无需指针)。像这样:
typedef struct
{
int damage;
char name[]; // terminated
} Item;
或
typedef struct
{
int damage;
int length_of_name;
char name[];
} Item;
答案 1 :(得分:1)
1) is there any other advantage to using the fixed size (1)
char name[40];
versus doing the following and using a pointer to a char array (2)?
char *name;
and if so, what is the advantage?
将您的数组声明为char name[40];
名称空间已经分配,您可以将信息从name
复制到name[0]
到name[39]
。但是,在char *name;
的情况下,它只是一个字符指针,可用于指向内存中的现有字符串,但是,除非您分配内存以保存,否则它本身不能用于复制信息那些信息。因此,假设您要将30个字符的字符串复制到name
,并声明为char *name;
,则必须先使用malloc
30个字符加上分配一个额外字符保持以null结尾的字符:
char *name;
name = malloc (sizeof (char) * (30 + 1));
然后您可以自由地将信息复制到name
。动态分配的一个优点是,如果您存储在名称中的信息增长,则realloc
可以name
内存。超过30个字符。在为name
分配内存后的另一个要求是,您负责释放不再需要的内存。这是使用一个而不是另一个的利弊/要求的粗略概述。
答案 2 :(得分:0)
如果您知道所需字符串的最大长度,则可以使用字符数组。它确实意味着您将使用比您通常使用动态分配的字符数组更多的内存。另外,如果您使用的是C ++,请查看CString。您可以使用strlen找到字符数组的长度。在静态分配的情况下,我相信它将是变量的一部分。动态可以在堆上的任何位置。