C Массив указателей Назначение адресов - PullRequest
0 голосов
/ 01 июня 2018
#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;

    }
}

Я так запутался, почему в моем массиве указателей "строк" ни один из его адресов не был изменен, когда ему был назначен адрес "строки".Почему это задание не работает?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Вы присваиваете неверный индекс в своем массиве, и назначаемая вами вещь не будет существовать, когда вам нужно ее использовать, эта переменная line выпадает из области видимости.Чтобы исправить это:

#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;
}

Хотя, конечно, вы всегда должны free все, что вы выделяете в принципе, поэтому написание функции для выделения lines, а также для освобождения - лучший подход здесь.

0 голосов
/ 01 июня 2018

Поскольку другие ответы объясняют, что вы обращаетесь к массиву вне пределов и вы назначаете адрес, область действия которого находится только до цикла for.

Переход к основной части вопроса " почему мой массиву указателей на «строки» не изменяется ни один из его адресов, когда ему назначается «строковый» адрес. Почему это назначение не работает? "

Здесь, даже если вы исправили значение индексакак "lines [i] = line;", это не сработает, так как вы назначаете один и тот же адрес каждому символьному указателю.Это потому, что «строка» - это массив символов, а имя массива символов всегда указывает на базу массива.Попробуйте, если вы просто пытаетесь увидеть операцию присваивания.

int main () {

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

for(int i=0;i<MAX_LINES;i++)
{
        lines[i]=&line[i];
}
0 голосов
/ 01 июня 2018

В вашем коде

lines[MAX_LINES+i]=line;

чисто неопределенное поведение , вы пытаетесь получить доступ к массиву за пределами.

Допустимый индекс для lines будетбыть от 0 до MAX_LINES -1.

Тем не менее, согласно вашему коду, line имеет область видимости тела цикла, вне области он становится недействительным.Если вы попытаетесь получить доступ к памяти, на которую указывают члены массива lines вне цикла, вы вызовете неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...