Dynamiczne przydzielanie pamięci dla tablicy

0

Witam wszystkich.

Właśnie zacząłem moją przygodę z C. Znalazłem zadanie w którym należy przydzielić pamięć dla tablicy (na początku 10 elementów). Następnie użytkownik wpisuje do tej tablicy liczby i po przekroczeniu rozmiaru tablicy następuje automatyczna realokacja na tablicę o 10 większą. Po wypisaniu "0" program ma wyświetlić wszystkie elementy. Mój kod wklejam poniżej. Przy podaniu dziesiątego elementu program się wysypuje (wyskakuje komunikat, że program przestał działać). Bardzo proszę o pomoc w znalezieniu przyczyny.

Pozdrawiam.

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

int main()
{
	int *tab,i,ile,rozmiar;
	rozmiar=10;
	tab=(int*)malloc(rozmiar);
	scanf_s("%d", &tab[0]);
	ile=1;
	for (i=1;tab[i-1]!=0;i++)
	{
		scanf_s("%d", &tab[i]);

		if (i==(rozmiar-1))
		{
			rozmiar+=10;
			tab=(int*)realloc(tab,rozmiar);
		}
		ile+=1;
	}
	printf("\n");
	for (i=0;i<ile;i++)
		printf ("%d\n",tab[i]);
	free(tab);
	
	return 0;	

}
1

Porównaj sobie mój kod ze swoim.

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

int main()
{
  int *array ;
  int i ;
  int var ;
  int size = 10 ;
  int counter = 0 ;

  array = (int*)malloc(sizeof(int) * size) ;

  while (1)
  {
    if (counter == size)
    {
      size += 10 ;

      array = (int*)realloc(array, sizeof(int) * size) ;
    }

    scanf("%d", &var) ;

    if (var == 0) break ;

    array[counter] = var ;

    counter++ ;
  }

  for (i = 0 ; i < counter ; i++)
  {
    printf("\n%d", array[i]) ;
  }

  free(array) ;

  return 0 ;
}
1

obecnie w C przy malloc/realloc itd... lepiej nie rzutować.

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

typedef struct {
	size_t next_id;
	size_t nalloc;
	int *data;
} darr_t;

darr_t darr_init(void) {
	static darr_t d={0,0,NULL};
	return d;
}

static void resize(darr_t *d) {
	d->nalloc = d->nalloc ? d->nalloc * 2 : 10;
	d->data = realloc(d->data,d->nalloc * sizeof(int));
}

void darr_add(darr_t *d, int n) {
	if(d->next_id >= d->nalloc)
		resize(d);
	d->data[d->next_id++] = n;
}

void darr_free(darr_t *d) {
    free(d->data);
    (*d) = darr_init();
}

void darr_print(darr_t d) {
	size_t i;
	for(i=0;i<d.next_id;++i)
		printf("%d ",d.data[i]);
	printf("\n");
}

int main(void) {
	darr_t d = darr_init();
	int userinput = -1;
	while(scanf("%d",&userinput)==1 && userinput)
		darr_add(&d,userinput);
	darr_print(d);
	darr_free(&d);
	return 0;
}
0
Lord Darkstorm napisał(a):

Porównaj sobie mój kod ze swoim.

Nie rozumiem dlaczego, gdy w twoim kodzie zamienię (int)malloc(sizeof(int) * size)* na (int)malloc(sizeof(int) + size)* to po przekroczeniu rozmiaru wyrzuca mi błąd program.exe has triggered a breakpoint.

karolinaa napisał(a):

obecnie w C przy malloc/realloc itd... lepiej nie rzutować.

Dlaczego? U mnie na wykładach nic o tym nie wspominali, a nawet często wspominali o konieczności rzutowania.

1

@arteq jak Ty byś zobaczył co u mnie na wykładach mówili. na szczęście rzucam ten kierunek na rzecz czegoś normalniejszego.

http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc
http://en.it-usenet.org/thread/20/588094/ a tutaj po polsku. swoją drogą dość ciekawie ludzie wypowiadali się w "internecie" w 98r co? ;]
coś jak przedwojenna ludność Warszawy w porównaniu do dzisiejszej

arteq napisał(a):

Nie rozumiem dlaczego, gdy w twoim kodzie zamienię (int)malloc(sizeof(int) * size)* na (int)malloc(sizeof(int) + size)* to po przekroczeniu rozmiaru wyrzuca mi błąd program.exe has triggered a breakpoint.

a w moim nie wyrzuca? ;) dodawanie to nie to samo co mnożenie w przypadku malloc jak masz int *arr = malloc(nalloc * sizeof(int)); to znaczy, że alokujesz pamięć dla nalloc intów. musi tam być mnożenie.

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