The fixed statement sets a pointer to a managed variable and "pins" that variable during the execution of statement. Without fixed, pointers to movable managed variables would be of little use since garbage collection could relocate the variables unpredictably. The C# compiler only lets you assign a pointer to a managed variable in a fixed statement.
The lifetime of the memory block which is allocated by stackalloc is limited to the lifetime of the method that defines it. You cannot free the memory before the method returns.