前一段时间做UDP传输,发送数据之前需要开辟一块内存作为承载数据的buffer
我是这么定义的:buff:array[1..300] of char;
因为其中有一段(20字节)要用来保存一个string类型的数据
开始的时候认为用for循环把string[I]放进去就结了(当时测试了一下也没什么异常)
后来其他函数也遇到相同类型的问题,我用同样的方法做的,但是传过去的数据在游泳数据之后带着很多脏数据。
这时候我开始关注buffer的真实发送的内容了,我在这两个函数上都添加了断点,结果发现没有问题的那个函数每次分配的内存都是很干净的(内容全部#0)但是有问题的那个buff里面很多的脏数据。后来虽然这个问题解决了(预先给他们都清零)但是有一个问题一直困扰着我,就是为什么我执行了那么多次,每次那个没有问题的函数分配到的内存的内容都是空的,但是那个老是处问题的函数分配的内存每次都有那么多脏数据?
我在想,delphi分配给buff的内存是随机的那?还是有一定算法算出来的,为什么不管哪两个函数,那个先执行,结果都是有问题的那个函数的内存里面又脏数据拿???
大家都来说两句自己的看法吧....
打字好累!!!!歇会儿...

解决方案 »

  1.   

    看来我说的不清楚:
    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歧视某些函数,呵呵,又知道为什么的吗?
      

  2.   

    buff是函数内部的变量
    在buff被划分出来之后
    未使用之前肯定都会有一些无用的数据在里面
    但是每一次procedure a 里面的buff的内容都是#0
    但是procedure b的内容则是杂乱无章(比较符合我的假象)
    but why?
      

  3.   

    先清空一下啦
    FillChar(buff, Length(buff), 0);
    复制字符串到buff也不用遍历啊
    Move(S[1], buff, Length(S))
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;好像跟声明顺序有关关注一下
      

  5.   

    先清空一下啦
    FillChar(buff, Length(buff), 0);
    复制字符串到buff也不用遍历啊
    Move(S[1], buff, Length(S))
    -------------------------------
    学习,谢谢...
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    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)所说,可能和分配的顺序有关
    我上面的代码,每次先声明的那个就是预先晴空的
    但是后声名的会有脏数据...
    希望看到的各位帮我测试一下上面的函数,看看你的结果和我的是否一样?
    谢谢了....
      

  7.   

    如果声明为局部的,Delphi不初始化它,内容是随机的,因为这些数据在栈上
      

  8.   

    heluqing 大哥:
    我只能帮您顶顶啊!
      

  9.   

    a,b函数分别是static的与class的成员函数是吧?
      

  10.   

    函数里面申请的变量不能保证初始化的,只有全局变量申请后,空间会初始化。
    好比申请个全局变量
    i:integer;
    程序里面使用的时候,i已经初始化为0,而在过程内部申请的变量,i的值是随机的。数组也是类似的机制。全局的数组申请后会初始化为0,而函数过程内部的就不一定了。/////////////////////////////////
    纯个人理解,对D变量的内存管理机制不是很清楚。
    ///////////////////////////////////////////////////////////////////
    程序中一般不应该出现数组未赋值就取值的问题。你的数据传输中,应该在程序里对String后面
    强加一个#0.