关于 delphi 内存操作问题

pc248 2015-05-05 11:11:39
各位大神好,小弟有点问题请教,虽然很菜,但还是自己搞不清楚。

代码如下


Var
Str:string;
Buffer:array [0..511] of Byte;
i:Integer;
begin
for i:=0 to 511 do
begin
Buffer[i]:=$30;
end;
SetLength(Str,512);
CopyMemory(Pointer(Str),Pointer(@Buffer),512);
end;





1, SetLength(Str,512); // 请问这里,指定字符串大小,但没有指定字符串的空间,会不会覆盖到内存数据?

2, 如果str已经在之前赋值了,比如 str:=123; 那么需要不需要重新分配空间呢? 你如 new (Pointer(123));但是释放的时候会出错。

3,如何给str分配空间呢?直接改变str的指针,指向memalloc后的地址?还是 GetMem(Pointer(str),512); ? 但是释放会出错啊。。

4,晚辈非科班出身,想询问业内人士,无奈认识的大牛很少,都去做移动开发了,delphi大牛不知何处寻,所以恳请csdn的高手解答,非常感谢!!!




...全文
304 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
Var Str:string; Buffer:array [0..511] of Byte; i:Integer; begin for i:=0 to 511 do begin Buffer[i]:=$30; end; SetLength(Str,512); CopyMemory(Pointer(Str),Pointer(@Buffer),512); end; 这段代码问题很多啊 Pointer(Str)是不对的, string 0字节处存放长度, 应该写成 @str[1] @Buffer yebudui a buffer已经是一个指针了 , 这么一来你是要使用2级指针吗? 上面的代码简单的写成SetLength(Str,512); FillChar(Str[1], 512, $30)
天行归来 2015-05-05
  • 打赏
  • 举报
回复
1, SetLength(Str,512); // 请问这里,指定字符串大小,但没有指定字符串的空间,会不会覆盖到内存数据? -->不会覆盖内存,Str 是在栈分配的内存 2, 如果str已经在之前赋值了,比如 str:=123; 那么需要不需要重新分配空间呢? 你如 new (Pointer(123));但是释放的时候会出错。 -->string 是根据你所复制的字符串长度动态分配内存,string 是在栈分配的内存,所以不需要用 dispose 来释放,要释放也得用 setlength(str,0) 3,如何给str分配空间呢?直接改变str的指针,指向memalloc后的地址?还是 GetMem(Pointer(str),512); ? 但是释放会出错啊。。 -->string 不需要 memalloc来分配内存(pchar需要),所以不存在释放 4,晚辈非科班出身,想询问业内人士,无奈认识的大牛很少,都去做移动开发了,delphi大牛不知何处寻,所以恳请csdn的高手解答,非常感谢!!! [/color][/b] [/quote]
lyhoo163 2015-05-05
  • 打赏
  • 举报
回复
字符串是一个特别的类型。 var Str:string;它只是指定String类型变量,只有赋值后,它才占用内存,记录内存起始值和长度,在这一段内存中保存字符串的值。 它的操作和引用,都是自动的。二个字符串类型的拷贝(赋值),往往不是真正意义上的拷贝,而是复制内存地址和内存长度。
武稀松 2015-05-05
  • 打赏
  • 举报
回复
字符串比较特殊,是使用引用计数的. 你赋值常量的时候当然会重新分配一块内存.旧的内容引用计数-1,如果引用计数到了0就释放内存. 两个字符串赋值,其实就是两个字符串变量都指到一块内存,这块内存引用计数+1,旧的引用计数-1的过程. 字符串实际上不会被修改,只要你改动就是重新分配,修改引用计数的过程.
pc248 2015-05-05
  • 打赏
  • 举报
回复
引用 1 楼 lynmison 的回复:
1, SetLength(Str,512); // 请问这里,指定字符串大小,但没有指定字符串的空间,会不会覆盖到内存数据? -->不会覆盖内存,Str 是在栈分配的内存 2, 如果str已经在之前赋值了,比如 str:=123; 那么需要不需要重新分配空间呢? 你如 new (Pointer(123));但是释放的时候会出错。 -->string 是根据你所复制的字符串长度动态分配内存,string 是在栈分配的内存,所以不需要用 dispose 来释放,要释放也得用 setlength(str,0) 3,如何给str分配空间呢?直接改变str的指针,指向memalloc后的地址?还是 GetMem(Pointer(str),512); ? 但是释放会出错啊。。 -->string 不需要 memalloc来分配内存(pchar需要),所以不存在释放 4,晚辈非科班出身,想询问业内人士,无奈认识的大牛很少,都去做移动开发了,delphi大牛不知何处寻,所以恳请csdn的高手解答,非常感谢!!! [/color][/b]
[/quote] 多谢大牛指点!!! 您的意思是,只要是 var 下 定义的局部变量,全部都是在堆栈中的,也就是 不在程序的任何一个段,而是在高地址,这就不涉及到会覆盖程序段的函数和参数? setlength(str,0) 是什么汇编操作呢? mov dword [@str - 4 ],0 ?
BambooCaep 2015-05-05
  • 打赏
  • 举报
回复
System.Move(Buffer[0], Str[1], 512);
源码链接: https://pan.quark.cn/s/4059260b3dc9 在电子设计自动化(EDA)范畴内,Verilog作为一项关键的硬件描述语言(HDL),被普遍应用于构建数字系统的模型,其应用范围涵盖从基础的逻辑门构造到高级的系统级设计,例如本案例所探讨的电梯系统。运用Verilog进行的电梯系统构建是一个典型的综合实践任务,它融合了数字逻辑、嵌入式系统以及计算机工程等多个核心知识领域。 我们必须明确电梯系统的功能要求。电梯需依据乘客的楼层指令,智能地选择其运行路径、选择停靠的楼层以及安排门的开启流程。这一过程涉及到状态机的设计,这是Verilog编程中的一个核心概念。状态机能够将电梯的操作流程划分为多个独立的状态,例如待机、上行、下行、开门、关门等,通过状态间的转换条件来执行各类操作。 Verilog程序通常由多个模块构成,每个模块对应电路的一部分。在此项目中,可能包含以下模块:主控制单元模块、楼层识别模块、按键输入单元模块、电机驱动模块等。各模块均具备特定的功能,例如主控制单元负责统筹各部分的工作,而电机驱动模块则依据指令操控电梯的升降动作。 在构建电梯系统时,还需关注实时性和同步性。例如,电梯不允许在两个楼层同时开启门,这需要在Verilog程序中运用适当的同步手段,例如边沿触发的时钟信号,以确保数据传输的精确性与统一性。 接下来是仿真环节和验证步骤。借助ModelSim或Vivado这类软件工具,我们可以对Verilog程序进行仿真,模拟电梯的操作情形,考察其在不同情境下的表现是否符合设计预期。此步骤极为关键,有助于识别并修正设计中的缺陷。 倘若设计满足所有条件,可将Verilog程序编译并上传至FPGA(现场可编程门阵列)进行硬件层...
内容概要:本文基于Simulink平台,构建了一个包含风能、太阳能、储能系统和质子交换膜(PEM)电解水制氢系统并网运行的交流母线协调仿真模型。该模型旨在研究多种能源形式与制氢负荷在共用交流母线下的协调运行机制,重点分析风光出力波动性对系统稳定性的影响,以及储能与制氢负荷在能量调节和消纳富余可再生能源方面的作用。通过设计合理的控制策略,实现系统内功率的动态平衡与高效利用,并对系统在不同工况下的动态响应特性进行了仿真验证,为高比例可再生能源接入背景下风光储氢一体化系统的规划与运行提供了技术参考。; 适合人群:具备一定电力系统、新能源或自动化专业背景,从事相关领域研究或工程应用的研发人员及高年级本科生、研究生。; 使用场景及目标:①研究风光储氢多能互补系统的集成与协调控制策略;②分析储能与电解制氢负荷在平抑可再生能源波动、提升系统稳定性方面的作用;③掌握基于Simulink的多能源系统建模仿真方法,服务于科研项目、毕业设计或工程预研。; 阅读建议:建议结合Simulink软件动手复现模型,重点关注各单元模块的控制逻辑与接口设计,通过调整参数和工况进行对比仿真,深入理解系统动态特性与协调运行机理。
下载代码方式:https://pan.quark.cn/s/06ddd041bd02 STM32CubeIDE是由STMicroelectronics(意法半导体)开发的一款功能全面的集成开发平台,主要面向STM32微控制器的应用。该v1.0.2版本特别适配于Windows操作系统,并且能够适用于x86及x64架构的计算机系统。STM32CubeIDE融合了代码编写、编译执行、调试诊断以及项目管理等多项核心功能,致力于精简STM32应用的开发步骤,从而显著提升开发工作的效率。 STM32CubeIDE的主要特性具体包含: 1. **集成开发环境(IDE)**:该平台提供了一个统一的操作界面,开发者能够在此平台上进行代码的编写、编译、链接以及调试STM32应用程序。IDE的设计注重用户体验,支持包括C和C++在内的多种编程语言。 2. **代码生成器**:STM32CubeMX作为STM32CubeIDE的一个组成部分,是一个图形化的配置工具,用户可以通过它来设定微控制器的多种参数,例如时钟系统配置、外设接口选择等。完成配置后,该工具能够自动生成初始化代码,从而大幅减少手动编写基础代码的工作量。 3. **项目模板**:STM32CubeIDE提供了多种预先配置好的项目模板,这些模板覆盖了STM32系列的不同微控制器型号,从而使得新项目的启动过程更加迅速和便捷。 4. **调试工具**:IDE内建了功能强大的调试器,支持JTAG和SWD接口,且兼容多种ST-LINK/V2、ST-LINK/V3以及各类第三方调试设备。调试功能涵盖了断点设置、变量监控、内存检查、性能评估等多个方面。 5. **编译工具链**:STM32CubeIDE集成了GCC编译器以及针对ARM...

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧