结构体指针的使用问题。。。(50)

  • 主题发起人 主题发起人 GodIsWrong
  • 开始时间 开始时间
G

GodIsWrong

Unregistered / Unconfirmed
GUEST, unregistred user!
pCanData = ^TAKCanData; TAKCanData = record NodeID: DWORD; Obj; Tobject; end; Obj在增加前初始化为一对象然后在listview.items.data := pCandata后出错
 
自然的,没理解所以,所以出错。没办法解决。
 
只看到把类型赋值过去了,没看到在那里初始化为对象的,你要不错的话安德森就错了~~var x: pCandata;begin new(x); x^.NodeID := 1; ... listview.items.data := x; ...
 
这个问题和这个是类似的:a=record aa:integer; bb:pchar;end;应用a时里面的bb其实指向是不可意料的,引用必然出错,使用前应该赋值:a.aa:=1;a.bb:=pchar('abcdefg'); // 编译机自动分配内存,并把地址赋值给a.bb
 
我在里面New了的,也初始化的比如另外一个结构体ptest = ^TtestTtest = record S: string; I: integer;end;现在,我用GetMem分配100个Ttest的内存给一个ptest变量,然后对Ptest赋值,每次赋值完后指针偏移量增加,但是报错,如果把S设为定长的字串string[8],则可以,为什么
 
建議把你這段處理代碼貼出來,你這樣說別人是找不到錯誤的,問題應該出在你的代碼處理上
 
我用GetMem分配100个Ttest的内存给一个ptest变量,然后对Ptest赋值,每次赋值完后指针偏移量增加你算偏移量的时候不会是把字符串长度算进去了吧
 
当然不会,Inc(Ptets);这样的方法修改偏移量
 
怎么没人发现没有分配内存?
 
来自:GodIsWrong, 时间:2009-10-19 18:57:09, ID:3979280我在里面New了的,也初始化的比如另外一个结构体ptest = ^TtestTtest = record S: string; I: integer;end;现在,我用GetMem分配100个Ttest的内存给一个ptest变量,然后对Ptest赋值,每次赋值完后指针偏移量增加,但是报错,如果把S设为定长的字串string[8],则可以,为什么 这是因为string[8]已经申请了内存,而定义的string并没有。就像:var s : string;begin GetTempPath(255,s); //这样也肯定会错的,因为没有给s分配内存end;默认的结构体例如: t : TTest;总是使用_InitializeRecord里的_InitializeArray来为record分配s的内存。
 
listview.items.data := 赋值后要记得释放
 
guanyue7613举个分配内存的例看看。。。 就假如是为结构体指针分配2个试试吧
 
GetMem只为数据结构已知大小的数据类型从内存管理器MemoryManager中取得指定大小的内存,所以他并没有为尚未确定的s分配内存,其指向仍然为nil;但如果使用New为ptest申请内存,则会在_New里申请完内存后,调用_Initialize(_InitializeArray)分配结构体里特殊部分的内容(例如:string类型),此时字符串类型不再指向nil,所以不会出错。Delphi的帮助简单地推荐使用new:Note: It is considered preferable to use the New and Dispose procedures rather than GetMem and FreeMem.事实上,在编译器的调控下,New和Dispose是一个智能函数,他们会根据指针内容的不同,处理指针内一些特殊字段的内存申请和释放;
 
Delphi自己的string类型最大可能隐藏了自身的复杂带来使用简单,但在不熟悉string类型时,建议使用这种分配方式避免一些不必要的错误:ptest = ^TtestTtest = record S: array[0..255]; I: integer;end;
 
呵呵,我猜你是太粗心了。“当然不会,Inc(Ptets);这样的方法修改偏移量”你是不是既使用ptests做索引指针又使用它做基址指针了?!即,你既Inc(Ptests),还FreeMem(Ptests),且在FreeMem时,未将Ptests所指内存块的首地址赋给Ptests。因为你未保存基址(分配的内存块的首地址),所以你在释放的时候会出错。我估计你是这么中招了。
 
好了,guanyue7613的正好让我解惑,谢谢
 
多人接受答案了。
 
后退
顶部