If String is !Copy then that means all values of Option<String> (including None) are !Copy too.
It's a bit of a hack, but you could use something like array::map().
let a: [Option<String>; 256] = [0; 256].map(|_| None);
It looks like Default is only implemented for arrays with lengths up to 32 instead of for any const N: usize, so we can't write something like let x: [Option<String>; 256] = Default::default()... However, we can fake it using map() from above:
My understanding is that it creates enough space for the [Option<String>; 256] on the stack (after making sure we have enough stack space left), goes into a while-loop that fills the first 168 of every 192 bytes with zeroes (the last 24 bytes are padding due to Option's tag), then copies the temporary [Option<String>; 256] to the destination requested by the caller.
I would have expected there to be some sort of Return Value Optimisation to elide that intermediate copy and write directly to where the caller wants our return value to be, but other than that there is no actual [0; 256] constructed.
While this specific case seems obvious, supporting general [expr; N] for non-Copy types isn't that simple. The only way to support it would be to .clone() the first element to fill the rest slot. But we don't have any other such implicit cloning in the language outside of macros. Unlike the Copy, .clone() invokes arbitrary function defined by user, not the language, which can be a footgun for both performance and safety.
Well, I believe the original motivation to invent the whole ownership/lifetime system was to prevent duplicating arbitrary heavy values on assignment like C++ does. If the language invent the borrow checker to eliminate single copy, it would be a reasonable guess that it will not accept N copies for the single syntactical element.
You can also do [(); 256].map(|_| None) to make it extra clear that it’s just a dummy (and also guarantee that it takes zero space).
On nightly, the array::from_fn method was just added this week, allowing you to just write let arr: [Option<String>; 256] = std::array::from_fn(|_| None); but might not be stabilized any time soon.