In other words, when it gets to console.log(length), which should be the response of the addStruct function, it is instead getting { [String: '2'] s: 1, e: 0, c: [ 2 ] }, and then getStruct errors out with Error: Invalid JSON RPC response: {"id":21,"jsonrpc":"2.0"}

Any idea why this is happening? Both of these things mean nothing to me, so I don't even know what to Google. I've looked at the Truffle and Solidity documentation, and as far as I can tell, I am doing everything correctly.

Perhaps unrelated, but I'm including just in case it isn't --
previously, I had deployed this to Ganache successfully and was playing around in the browser console. I was able to call web3.eth.contract(abi) and get what appears to be the correct response, but when I added the address as an argument, it refused to give me anything except "invalid address." I confirmed in the web3 and ganache documentation that I was doing it right about 10 times, so I'm thinking that maybe something else is wrong. Or maybe not -- feel free to ignore this part.

For the second issue, I believe the problem is that you used call instead of sendTransaction when you invoked addStruct. Calls don't actually send transactions out to the network; they just run the function locally and then discard the side effects. So no struct was actually added to MyStructs. The subsequent call to getStruct will fail because it uses an invalid index into the array. (It tries index 0, but the array length is still 0.)