Tablica dynamiczna - funkcja malloc, naruszenie pamięci

0

Witam
Próbuję napisać program który będzie przechowywał ceny diamentów. Muszę napisać funkcję, która pobierze od użytkownika ilość diamentów, a następnie dla każdego z nich pobierze jego cenę. Chciałem użyć funkcji malloc do stworzenia tablicy dynamicznej. Problem pojawia się, gdy próbuje pobrać ceny.
Gdy zapiszę w ten sposób:

 
void wczytanie(int **lista, int *liczba)
{
	int i;
	printf("Podaj liczbę diamentów\n");
	scanf("%d", *&liczba);
	*lista = malloc(*liczba*sizeof(int));
}

int main(void)
{	
	int i, liczba;
	int *lista;

	wczytanie(&lista, &liczba);

	for(i=0;i<liczba;i++)
	{
	scanf("%d",&lista[i]);
	};

	free(lista);
	
return 0;
}

działa, ale jak próbuję pętlę for przenieść do funkcji pokazuje mi naruszenie ochrony pamieci już przy próbie zapisania drugiej ceny:

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

void wczytanie(int **lista, int *liczba)
{
	int i;
	printf("Podaj liczbę diamentów\n");
	scanf("%d", *&liczba);
	*lista = malloc(*liczba*sizeof(int));

	for(i=0;i<(*liczba);i++)
	{
	scanf("%d",lista[i]);
	};
}

int main(void)
{	
	int i, liczba;
	int *lista;

	wczytanie(&lista, &liczba);


	free(lista);
	
return 0;
}

Jestem początkującym programistą, nie moge niczego wymyślić ani znaleźć podobnego problemu. Z góry dzięki za pomoc

1
    scanf("%d", *&liczba);

? Skoro liczba to wskaźnik to zrób po prostu scanf("%d", liczba); a nie kombinuj ;]

  1. Sam sie prosisz o guza bo bawisz się tu wielokrotnymi gwiazdkami i mieszasz pobieranie adresu z dereferencjami wskaźników, a wygląda na to że średnio to rozumiesz.
    *lista = malloc(*liczba*sizeof(int));
 
    for(i=0;i<(*liczba);i++)
    {
    scanf("%d",lista[i]);
    };

Popatrz na ten kod. lista to wskaźnik do wskaźnika do int. To znaczy że *lista to jest wskaźnik do int / tablica intów. A ty próbujesz operować podczas wczytywania na tym tak jakby to lista była tablicą intów, a w rzeczywistości tablicą jest dopiero blok pamięci wskazywany przez lista.

2
  1. scanf("%d",&(*lista)[i]);
  2. scanf("%d",(*lista)+i);
  3. Generalnie złe podejście spróbuj:
typedef struct tablica_ { size_t count; double *prices; } tablica;
tablica wczytanie()
  {
   size_t i;
   tablica tmp;
   scanf("%d",&tmp.count);
   tmp.prices=(double*)malloc(tmp.count*sizeof(double));
   for(i=0;i<tmp.count;++i) scanf("%lf",tmp.prices+i);
   return tmp;
  }

int main()
  {
   tablica tb;
   printf("Podaj liczbę diamentów a następnie ich ceny:\n");
   tb=wczytanie();
   free(tb.prices);
   return 0;
  }
0

W porządku, już rozumiem, dzięki :)

scanf("%d",&(*lista)[i]);

Chciałem w ten sposób napisać, ale nie pomyślałem o okrągłych nawiasach, a potem znaki &* usunalem bo wiedzialem ze nie mają sensu :)
Dzięki też za drugi sposób :)

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