А помимо стандартной библиотеки, все нужное есть еще и в WinAPI.
Вот как тут компилятор, процессор или не знаю что) понимает что именно находится в этих ячеек ?правильный.
char * heap = malloc(sizeof(int) + 2*sizeof(char) + sizeof(double));
int *pi = (int*)heap;
char * pa = heap + sizeof(int);
char * pb = heap + sizeof(int) + sizeof(char);
double * pd = (double*)(heap + sizeof(int) + 2 * sizeof(char));
*pi = 1024;
*pa = 'ы';
*pb = 'Ъ';
*pd = 3.14;
printf("%d %c %c %f\n", *pi, *pa, *pb, *pd);
*pd = (*pd) * (*pi) * (*pa) * (*pb);
printf("%f\n", *pd);
Обычно я делаю так: собираю приложение с отладочной информацией, запускаю под отладчиком в IDE, стартую без точек останова. Там где произойдет ошибка программа остановится и вернется в отладчик, в отладчике нужно по стеку вызовов перейти на свою последнюю функцию и уже в нужной точке анализируешь, что ж ты там написал.
Иногда бывает, что программа с отладочной информацией работает, а в "релизной" сборке не работает - значит где-то выход за пределы массива/обращение к не выделенной памяти (не инициализированному указателю)...
На каком этапе работы программа вываливается (это можно определить по сообщениям, которые выводятся программой)? Какие входные данные подаете при этом? На чем именно из входных данных программа вываливается?