Není tam náhodou nějaké omezení ohledně paměti? Ty totiž netestuješ návratové hodnoty malloc(), takže se nedozvíš, jestli se paměť podařilo naalokovat, nebo ne. Buď od té funkce dostaneš ukazatel, nebo NULL, a na adresu 0 se zaručeně zapisovat nedá (tedy dá, je tam tabulka vektorů přerušení, ale určitě jí nedostaneš přidělenou jako pracovní).
Mě to při 100000:100000 také hodí SIGSEGV. Samotné vstupy se do toho prostoru sice vejdou, ale už není místo pro pole výsledků! Takže ošetři ty návratové hodnoty, a přemýšlej co s tím, jestli v takovém případě nahlásit chybu a skončit, nebo zkusit vymyslet něco jiného:
Kód: Vybrat vše
printf("Zadejte koeficienty polynomu A:\n");
if ((koef_A = (int *) malloc( (A+1) * sizeof(int) )))
for( i=0; i<(A+1); i++ )
{
if( scanf("%d", &tmp)!=1 )
{
printf("Nespravny vstup.\n");
return 1;
}
koef_A[i] = tmp;
}
else
{
printf("Malo pameti pro polynom A.\n");
return 1;
}
To provede tohle, místo pádu programu:
Kód: Vybrat vše
Zadejte stupen polynomu A:
Zadejte koeficienty polynomu A:
Zadejte stupen polynomu B:
Zadejte koeficienty polynomu B:
Malo pameti pro vysledek.
A také neuvolňuješ paměť pole výsledků, ono se to sice obvykle udělá automaticky při ukončení programu, ale nejde na to spoléhat. Takže buď otestuj jestli v těch ukazatelích není NULL (pokud je, tak ti to také spadne) a pak je teprve uvolni (a rovnou si do nich zapiš svůj NULL), nebo to uspořádej takhle, aby program vůbec neprováděl části, které jsou v takovém případě zbytečné:
Kód: Vybrat vše
if (1. malloc)
{
načtení 1;
if (2. malloc)
{
načtení 2;
if (3. malloc)
{
výpočet;
zobrazení;
free 3;
}
else
chyba 3;
free 2;
}
else
chyba 2;
free 1;
}
else
chyba 1;
To se mi osvědčilo hlavně při otevírání víc souborů

V Céčku se prostě musí hlídat úplně všechno, tenhle jazyk za tebe neudělá vůbec nic, správně bys měl kontrolovat i to co ti hlásí printf() a nějak na to reagovat

Ale blbost! Asi mi teprve začíná po ránu zapínat IQ, tak jsem si ty alokované velikosti spočítal ručně.
Takže první alokace zabere 400004 bajtů.
Druhá alokace zabere také 400004 bajtů.
A alokace pro výsledek by měla zabrat 800008 bajtů, ale zabere 40000800000 bajtů!
40 giga RAM teda fakt nevlastním
Takže takhle:
if ((vys = (int *) malloc( (A+B+2) * sizeof(int) )))a při nulování pole:
for( i=0; i<((A+B+2)); i++ )To mi připomnělo toho astronauta, co si na let k Měsíci vzal sebou pro jistotu logaritmické pravítko, protože tomu řídícímu počítači prostě nevěřil, a všechno co do něj zadal si přepočítával osobně

No, tomu mému vraku to trvalo 11:34 minuty

Jen takový fór, uhodneš co udělá tohle?
Kód: Vybrat vše
int main(void)
{
int p[10],a,b,c;
p[10]=12345;
return 0;
}