Portál AbcLinuxu, 12. května 2025 07:05

Dotaz: Pole v C

23.11.2008 09:05 pole
Pole v C
Přečteno: 599×
Odpovědět | Admin
Dobrej den, nejsem moc skuseny programator, prave zacinam programovat v C. Naprogramoval jsem si program, ale dava mi nejakou chybu Segmentation fault.

int N, i, *p_i;

p_i= (int *) malloc(N * sizeof(int));

scanf("%d", &N);

for (i=0; i < N; i++){

scanf("%d", p_i+i);

printf("\n%d\n", *(p_i+i));

}

Tohle je cast kodu. Pamet se alokuje sparvne, delal sem test na NULL. Nevite kde by mohl byt problem? Program spravne uklada hodnoty do pola, ale v momente kdy by mnel cyklus opustit vypise Segmentation fault a program ukonci. Dik moc
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.11.2008 09:28 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: Pole v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Alokuješ paměť pro pole ještě než se dozvíš jeho velikost (N).
Užívej dne – možná je tvůj poslední.
23.11.2008 09:38 pole
Rozbalit Rozbalit vše Re: Pole v C
Spatne jsem prepsal kod. Samozrejme alokuji az po zjisteni N.
23.11.2008 10:29 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: Pole v C
Tohle u mne žádný SIGSEGV nevyvolá:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int N, i, *p_i;

  scanf("%d", &N);
  p_i = (int *) malloc(N * sizeof(int));

  for(i = 0; i < N; i++)
  {
    scanf("%d", p_i + i);
    printf("\n%d\n", *(p_i + i));
  }

  return 0;
}

Užívej dne – možná je tvůj poslední.
23.11.2008 11:13 pole
Rozbalit Rozbalit vše Re: Pole v C

Nechapu to.

Ja jsem skompiloval jeste jednou a ted to funguje. Ak vsak skompiluju znovu, tak to nejede a pak zas jede. Kompiloval jsem presne tento kod.

Takze se to uz z casti vyresilo. Ale proc raz jede, raz ne ?

Dekuji

David Watzke avatar 23.11.2008 11:41 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Pole v C
Možná HW problém... paměti jsou ok, nic jinýho nezlobí?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
23.11.2008 10:29 Boris Dušek | skóre: 22 | blog: everything
Rozbalit Rozbalit vše Re: Pole v C

 

Spatne jsem prepsal kod.

 

s g++ i Visual C++ to nepadá - možná by bylo lepší poslat větší část originálního kódu? Taky by se hodilo znát přesné hodnoty, na kterých to padá (když na "všech", tak aspoň jeden příklad - určitě si netestoval všechny možné vstupy, těch je nekonečně mnoho).

vim ~/.emacs
23.11.2008 12:05 kvé
Rozbalit Rozbalit vše Re: Pole v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Podivejte se pres gdb nebo valgrind, kde a kvuli cemu to padne.
23.11.2008 17:31 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Pole v C
Nebo jednodušeji:

printf ("Zadej počet prvků: ");, printf ("Zadej %i. prvek: ", i);
Quando omni flunkus moritati
23.11.2008 18:28 kvé
Rozbalit Rozbalit vše Re: Pole v C
Nerekl bych, ta chyba muze byt zpusobena spatnym zapisem do pameti z upne jineho mista programu.
23.11.2008 19:21 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Pole v C
a) Stejně to bude vypadat líp, když ten program vypíše, co chce, místo aby jenom čekal, až zahřmí

b) Pokud je chyba opravdu v tomto kódu, bude to jednodušší než zjišťovat, jak funguje valgrind a gdb.
Quando omni flunkus moritati
24.11.2008 12:09 kvé
Rozbalit Rozbalit vše Re: Pole v C
Tento kod je ale spravne, proto mu to bude k nicemu.
25.11.2008 00:25 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Pole v C
Viz bod a)
Quando omni flunkus moritati

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.