#define MAX_LINES 20
#define MAX_LINE 20

int main(){

    char *lines[MAX_LINES];
    for(int i=0;i<MAX_LINES;i++){

            char line[MAX_LINE];
            lines[MAX_LINES+i]=line;

    }
}

Jestem taki zdezorientowany, dlaczego moja tablica wskaźników "Lines" nie ma żadnych adresów zmienianych, gdy przypisany jest adres "linia". Dlaczego to nie działa?

0
Berlios 1 czerwiec 2018, 20:14

3 odpowiedzi

Najlepsza odpowiedź

Przydzielasz do niewłaściwego indeksu w swojej tablicy, a rzecz, którą przypisujesz, nie będzie istnieć, gdy trzeba go użyć, że line zmienna spada poza zakresem. Naprawić to:

#define MAX_LINES 20
#define MAX_LINE 20

int main(){
  char *lines[MAX_LINES];

  for(int i=0;i<MAX_LINES;i++){
    lines[i] = malloc(MAX_LINE);
  }

  return 0;
}

Chociaż oczywiście powinieneś zawsze free wszystko, co przydzielasz jako kwestię zasady, więc pisząc funkcję, aby przydzielić lines, a także bezpłatnie to najlepsze podejście tutaj.

2
tadman 1 czerwiec 2018, 17:23

W twoim kodzie

lines[MAX_LINES+i]=line;

Jest czysty Udefiniowane zachowanie, próbujesz uzyskać dostęp do tablicy poza granicami.

Prawidłowy indeks dla lines byłby 0 do MAX_LINES -1.

To powiedziawszy, zgodnie z kodem, {x0}} ma zakres korpusu pętli, poza zakresem, staje się nieważny. Jeśli spróbujesz uzyskać dostęp do pamięci wskazanej przez członków tablicy lines poza pętlą, wywołasz niezdefiniowane zachowanie.

2
Sourav Ghosh 1 czerwiec 2018, 17:25

Ponieważ inne odpowiedzi wyjaśniają, że masz dostęp do tablicy poza granicami i przypisywasz adres, którego zakres jest tylko do pętli.

Zbliżając się do głównej części pytania " Dlaczego moja tablica wskaźników" Lines "nie ma żadnych adresów zmienianych, gdy przypisano do niego adres" linia ". Dlaczego taka przypisanie nie działa?"

Tutaj nawet jeśli poprawisz wartość indeksu jako "linie [i] = linia;", nie działa, ponieważ przypisujesz ten sam adres do każdego wskaźników znaków. Dzieje się tak dlatego, że "linia" jest tablicą znaków i nazwę tablicy znaków zawsze wskazuje na podstawę tablicy. Wypróbuj to, jeśli próbujesz zobaczyć operację przypisania.

Int main () {

char *lines[MAX_LINES];
char line[MAX_LINES];

for(int i=0;i<MAX_LINES;i++)
{
        lines[i]=&line[i];
}
0
Anoop Mourya 1 czerwiec 2018, 18:34