Help on array pointers

Vino akashvino79 at gmail.com
Fri Sep 15 16:55:34 UTC 2023


On Friday, 15 September 2023 at 15:27:00 UTC, Vino wrote:
> On Friday, 15 September 2023 at 02:25:09 UTC, Joe wrote:
>> On Thursday, 14 September 2023 at 14:21:09 UTC, Vino wrote:
>>> [...]
>>
>> A pointer is a type that points to something. It's literally 
>> that simple. Every piece of data and code exist somewhere in 
>> memory. Every piece of memory has an address. The address is 
>> what a pointer contains. Sometimes we want a type that is the 
>> address itself rather than a value/number.
>>
>> [...]
>
> Hi Joe,
> Thank you very much for the explanation can you please correct 
> me if my understanding is incorrect
> ```
> byte[] z; // Creates an array of bytes. That is, the compiler 
> will create a pointer to an array of memory and track it's 
> length and deal with memory allocation and all that.
> ```
> If we use the above method then :
> The compiler takes care of initilizing the array and free the 
> memory after the usage.
> And this is the recommended method.
>
> ```
> We can use a pointer as an array also, this is the "old school 
> way of creating arrays".
>     int qlen = 5;
>     int* q = cast(int*)malloc(int.sizeof*qlen);
> ```	
> If we use the above method then :
> We need to manual initilize the array.
> Ensure that the memory is freed after the usage using try/final 
> block.
>
> By default the memory allocation for arrays in D is based on GC 
> (expect for std.array containers) if we want to reduce/avoid GC 
> then we need to use the old school way of creating the arrays.
>
> In case of using the old school ways then can you guide me what 
> is wrong in my earlier code that I am getting the below error 
> and how do I correct the same.
>
> Error
> ```
> Invalid Name passed: /T&name
> double free or corruption (out)
> Error: program killed by signal 6
> ```

Hi All,

      At last was able to resolve the issue, but not sure whether 
this is the reight solution.

Code:
```
import std.stdio: writeln;
import std.exception: enforce;
import std.range: empty;
import std.format: format;

     auto ref testNames(in string[] names) {
       enforce(!empty(names), "Names cannot be Empty or Null");
         		
      import core.stdc.stdlib;
      import std.algorithm: any, canFind;
      		
      string[] _names;
      size_t len = 19;
      char[] invalid = (cast(char*)malloc(char.sizeof * 
len))[0..len];
      invalid[0 ..len] = 0; //Array Initlization
         		
      try {
            version(Posix) {
               invalid = 
['\'','\"',':',';','*','&','/','[',']','-','+','$','#','<','>','{','}','(',')'];
           }

           foreach(i; names.dup) {
           auto result = i.any!(a => invalid.canFind(a));
           if(result) { throw new Exception("Invalid Name passed: 
%s".format(i)); }
           else {_names = names.dup; return _names; }
           }
         } catch(Exception e) { writeln(e.msg);  }
           finally { invalid = null; free(invalid.ptr); } // added 
invalid = null resolved the issue
          return _names;
     }

     void main () {
         writeln(testNames(["/T&name"]));
     }

From,
Vino


More information about the Digitalmars-d-learn mailing list