Naruszenie ochrony pamięci

0

Po dodaniu ostatniej petli ktora ma sortowac tablice c[i] wystepuje blad Naruszenie ochrony pamięci (core dumped)
Co on dokladnie oznacza i jak sie tego pozbyc , wczesniej nigdy cos takiego mi się nie pojawialo?

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
int n;
int i;	
float wartosc;
float rozmiar;
int a[i];
int b[i];
int c[i];
int temp;

printf("Podaj rozmiar plecaka: \n");
scanf("%d",&n);
printf("rozmiar %d   \n",n);

for(i=0;i<n;i++)
{
printf("Podaj wartosc i wage przedmiotu:\n");
scanf("%f",&wartosc);
a[i]=wartosc;
scanf("%f",&rozmiar);
b[i]=rozmiar;
}

for(i=0;i<n;i++)
{
printf("wartosc elementu  a[%d] \n", a[i]);
printf("waga elementu  b[%d] \n", b[i]);
}
for(i=0;i<n;i++)
{
c[i]=a[i]/b[i];
printf("a/b  c[%d] \n", c[i]);
}
for(i=0;i<n;i++)
{
if(c[i]>c[i+1]) {
       	temp = c[i];
     	c[i] = c[i+1];
        c[i+1] = temp;
     }
}


  
  
  
	return 0;
}
0

int a[i]; czemu wg ciebie teraz równe i ?

0

jesli jest w pentli to i=0 wtedy moge przejsc po calej tablicy ale na start 0
dopiero sie czcze takze przepraszam jezeli to jakas blachostka..

0

gdy "i" będzie równe n - 1(przy ostatniej iteracji pętli). Porównujesz nie istniejący element(i = n). To jeszcze nie spowoduje błędu. Nastąpi on dopiero przy próbie zamiany tych elementów.
//edit teraz zauważyłem ,że tablica ma jakąś randomową wielkość. Bo na początku nie zainicjalizowałeś zmiennej i. Tak czy siak nawet jak "i" równało by się liczbie elementów tablicy którą chcesz posortować ten algorytm który napisałeś i tak nie zadziała.

0

rozmumiem ze zle jest zdefiniowana tablica ale teraz jak ja poprawic
czy
a[n] ale tak chyba tez jest zle bo jak mowi pan z gory wydaje sie to zlym rozwiazaniem..
a[0] tylko czy ustawiajac tablice na 0 , bede mogl po niej przechodzic , chyba nie?
więc..

0

Powinno się albo zadeklarować:
int a[100];
i oczywiście pilnować aby wprowadzona n była nie większa niż 100
Albo zadeklarować:
int a;
zaś po wprowadzeniu n:
a=(int
)malloc(n*sizeof(int));
zaś na końcu nie zapomnieć o:
free(a);
lib zdać się na niekompatybilne sztuczki gcc deklarując po wprowadzeniu n:
int a[n];
Z tym że i tak wyskoczy poza pamięć, patrz uwagę od @robcio.

1 użytkowników online, w tym zalogowanych: 0, gości: 1