前一段时间做UDP传输,发送数据之前需要开辟一块内存作为承载数据的buffer
我是这么定义的:buff:array[1..300] of char;
因为其中有一段(20字节)要用来保存一个string类型的数据
开始的时候认为用for循环把string[I]放进去就结了(当时测试了一下也没什么异常)
后来其他函数也遇到相同类型的问题,我用同样的方法做的,但是传过去的数据在游泳数据之后带着很多脏数据。
这时候我开始关注buffer的真实发送的内容了,我在这两个函数上都添加了断点,结果发现没有问题的那个函数每次分配的内存都是很干净的(内容全部#0)但是有问题的那个buff里面很多的脏数据。后来虽然这个问题解决了(预先给他们都清零)但是有一个问题一直困扰着我,就是为什么我执行了那么多次,每次那个没有问题的函数分配到的内存的内容都是空的,但是那个老是处问题的函数分配的内存每次都有那么多脏数据?
我在想,delphi分配给buff的内存是随机的那?还是有一定算法算出来的,为什么不管哪两个函数,那个先执行,结果都是有问题的那个函数的内存里面又脏数据拿???
大家都来说两句自己的看法吧....
打字好累!!!!歇会儿...
我是这么定义的:buff:array[1..300] of char;
因为其中有一段(20字节)要用来保存一个string类型的数据
开始的时候认为用for循环把string[I]放进去就结了(当时测试了一下也没什么异常)
后来其他函数也遇到相同类型的问题,我用同样的方法做的,但是传过去的数据在游泳数据之后带着很多脏数据。
这时候我开始关注buffer的真实发送的内容了,我在这两个函数上都添加了断点,结果发现没有问题的那个函数每次分配的内存都是很干净的(内容全部#0)但是有问题的那个buff里面很多的脏数据。后来虽然这个问题解决了(预先给他们都清零)但是有一个问题一直困扰着我,就是为什么我执行了那么多次,每次那个没有问题的函数分配到的内存的内容都是空的,但是那个老是处问题的函数分配的内存每次都有那么多脏数据?
我在想,delphi分配给buff的内存是随机的那?还是有一定算法算出来的,为什么不管哪两个函数,那个先执行,结果都是有问题的那个函数的内存里面又脏数据拿???
大家都来说两句自己的看法吧....
打字好累!!!!歇会儿...
1、两个函数 procedure a;
procedure b;
2、两个函数都是为了向远方发送UDP数据包的,都用到了一个buff:array[1..300] of Char;
3、这两个函数被调用的时候,无论谁先谁后,都会有a程序里的buff未赋值之前里面内容都是#0
但是B程序的buff则什么东西都有;
4、我个人认为程序被调用执行的时候,buff(局部变量)都是随机的从内存里面划出来一块的,但是为什么每次a程序分到的内存都是干净的,但是b分到的都是脏的那?
5、为b抱不平,觉得borland歧视某些函数,呵呵,又知道为什么的吗?
在buff被划分出来之后
未使用之前肯定都会有一些无用的数据在里面
但是每一次procedure a 里面的buff的内容都是#0
但是procedure b的内容则是杂乱无章(比较符合我的假象)
but why?
FillChar(buff, Length(buff), 0);
复制字符串到buff也不用遍历啊
Move(S[1], buff, Length(S))
var
b:array[0..300]of char;
a:array[0..300]of char;
begin
showmessage(b);
showmessage(a);
end;procedure TForm1.Button2Click(Sender: TObject);
var
a:array[0..300]of char;
b:array[0..300]of char;
begin
showmessage(b);
showmessage(a);
end;好像跟声明顺序有关关注一下
FillChar(buff, Length(buff), 0);
复制字符串到buff也不用遍历啊
Move(S[1], buff, Length(S))
-------------------------------
学习,谢谢...
var a:array[1..300] of Char;
b:array[1..300] of Char;
begin
showmessage('先声名的a'+a);
showmessage('后声名的b'+b);
end;procedure TForm1.Button2Click(Sender: TObject);
var b:array[1..300] of Char;
a:array[1..300] of Char;
begin
showmessage('后声名的a'+a);
showmessage('先声明的b'+b);
end;
-------------------------------
好像正如chijingde(AD)所说,可能和分配的顺序有关
我上面的代码,每次先声明的那个就是预先晴空的
但是后声名的会有脏数据...
希望看到的各位帮我测试一下上面的函数,看看你的结果和我的是否一样?
谢谢了....
我只能帮您顶顶啊!
好比申请个全局变量
i:integer;
程序里面使用的时候,i已经初始化为0,而在过程内部申请的变量,i的值是随机的。数组也是类似的机制。全局的数组申请后会初始化为0,而函数过程内部的就不一定了。/////////////////////////////////
纯个人理解,对D变量的内存管理机制不是很清楚。
///////////////////////////////////////////////////////////////////
程序中一般不应该出现数组未赋值就取值的问题。你的数据传输中,应该在程序里对String后面
强加一个#0.