Tablica dynamiczna - funkcja malloc, naruszenie pamięci

Odpowiedz Nowy wątek
2015-01-02 16:52
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

Pozostało 580 znaków

2015-01-02 17:02

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.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2015-01-02 17:03

Pozostało 580 znaków

2015-01-02 17:02
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;
}


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-02 17:22
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 :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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