There is an intimate relation between an array and a string, the only difference is in the end of string, in the case that we are dealing with is an array of characters and a string, the difference is that in the second case we have a Extra character, the '\ 0' that tells us where our chain ends. This is an important difference because the C language does not allow us to know where an array ends except in the case that we put a "mark" as it happens with the strings, the following declarations are equivalent:
string s = "Hello";
char* s = "Hello";
char s[6] = {"Hello"};
char s[6] = ['H','e','l','l','o','\0'];
However, it is not:
char s[5] = ['H','e','l','l','o'];
Is an array of characters because it lacks the character '\ 0'.
There is also an intimate relationship between string and pointers your statement:
s[0] = eng_char[0];
Is really trying to reassign two pointers that are in the stack and are read only, it is not possible to relocate its address unless we declare a variable type pointer to char and reserve memory so you can store a variable, but your statement as how is it a mistake.
About
char array[strlen(s)] = {'a'};
Surely it is that at the time of compilation, the compiler can not know what length has strlen(s), since it is surely not a constant at compile time, hence the error. To solve it we can do something like:
int n = strlen(s);
char array[n];
array[0] = 'a';
I hope this help.