Grande NicholasPufal!
Vamos trabalhar por partes, como diria o Jack, o estripador. Piada velha...
Seu
int* x[10];
contém apenas ponteiros para o limbo e perigosos, como você bem sabe. O endereço deste limbo está na stack.
Quando você faz:
for(i = 0; i < 10; ++i)
x[i] = malloc(sizeof(int)*10);
Você aloca memória na heap. Você terá 10 ponteiros apontando para 10 vetores de 10 posições. O endereço para estes vetores estão na stack e os valores, alocação, data, está na heap.
Concluindo, que você está correto na sua analise!
Sobre Obj-C, podemos ter objetos declarados de uma forma global ou no escopo de uma classe. Neste caso, o endereço e data estão no heap.
Da outra forma, seria como já discutimos mais acima.