结构里面不能使用长字符串???(50)

  • 主题发起人 主题发起人 liuguilg
  • 开始时间 开始时间
L

liuguilg

Unregistered / Unconfirmed
GUEST, unregistred user!
type TPerson = record name: string[12]; {在结构里面不能使用长字符串} age: Word; end;///////////////////////////////////没有说明, 谁能解释下,为什么说 在结构里面不能使用长字符串
 
王八屁股。
 
结构里不是不可以有 String 类型,但 String 类型本质是指针,因此如果你需要把这个结构保存到文件(或流),你就不能使用 String 类型的成员
 
好像是不能超过255,可以考虑用如何形式name: array[1..12] of Char;
 
是的,请用array of char代替
 
有这个疑问,实质上是对delphi的字符串不是很了解导致的。S: String 在这个定义中,S本身是一个指针,SizeOf(S) 不论你是否给S赋值,其值永远是是4(如果想知道一个字符串的长度,使用Length(S)),S 是一个指向实际字符串内容的指针,也就是实际字符串的首地址。S: String[12] 这种声明,和上面的声明是有区别的,这样的声明 SizeOf(S)其结果是13,为什么是13呢?因为这种声明实际上是声明了一个 短字符串,短字符串的结构是第一个字节保存着字符串长度,随后的字节保存着字符串的值,也就是实际字符串好了,上面的说完了。那说说结构中使用字符串时候需要注意的问题吧:如果是想对结构中的内容整体的复制、保存等,最好使用字符数组,因为字符数组能真实地按照你定义的大小反映实际大小,而采用 String[12]这种形式,实际占有内存大小会比形式上多一个,而 String 形式,则不论你的字符串是什么内容,其结构中占用的大小永远是4。这样的定义是不能直接使用move 或者 copy...等函数直接操作结构体变量的(操作了也没有用,还会引起更大的麻烦,因为 String 是一种可计数的资源,其释放与否与其引用计数有关,而直接采用move的方式复制结构体的内存不会改变计数,单却多出来一个引用)是不是字符串就不能被定义到结构中呢?那到也不是,就是在定义之后,对结构体的复制操作要自己定义出来,不过这样的定义,还不如定义一个类来的方便(类本身就是对一种数据以及对这种数据的操作的一种定义)。
 
长字符串本身就是一个之智能指针.你要存储的话保存下来只是一个指针的地址.另外这样的结构体指针在构造和销毁的时候要注意一下.如果仅仅在内存中使用不涉及到序列化和内存拷贝其实是没什么问题的.
 
后退
顶部