Понимание массивов в Objective-C / C - PullRequest
1 голос
/ 03 февраля 2010

Я только что сделал свои первые шаги, переходя в Objective-C . У меня очень простой вопрос о том, как работают массивы.

У меня есть два файла .m:

1)

Line = origin[6];
forloop(i...i++) {
    origin[i]=7;
}
[buildSubview:origin];

2)

Line response[6]; 

-(id)buildSubview:(Line[])origin {
    *response=*origin;
    NSLog(@"response[1]=%o",response[1]);
    NSLog(@"origin[1]=%o",origin[1]);
    ........
    .....
}

Вывод, который я получаю:

response[1]=0; <-- I would expect the same value as origin
origin[1]=7;

Но если я попрошу напечатать значение с индексом 0, я получу то, что ожидал:

response[0]=7; <-- Now they are the same
origin[0]=7;

Я спрашиваю, почему два разных значения? А также, почему, если я напишу

response=origin;

Я получаю несовместимую ошибку компиляции присвоения?

1 Ответ

3 голосов
/ 03 февраля 2010

Вкратце, иногда , имя массива в C "распадается" на указатель на первый элемент массива, и это вызывает у вас проблемы.

Когда вы пишете

response=origin;

Имя origin в RHS "распадается" для типа Line * и указывает на первый элемент массива origin, тогда как response имеет тип "array [6] of Line". Поскольку оба типа несовместимы (инициализация массива указателем не имеет смысла), это ошибка.

Теперь

*response=*origin;

не копирует всю память из origin в response. Как я упоминал выше и более подробно в приведенной выше ссылке, origin указывает на первый элемент массива origin в этом контексте, поэтому *origin фактически является первым элементом массива. Поэтому *response=*origin; просто копирует значение первого элемента массива origin в первый элемент response. Поскольку вы не присвоили значение response[1], оно содержит мусор.

Если вы хотите скопировать данные массива, вы можете сделать цикл:

size_t i;
for (i=0; i < 6; ++i)
    response[i] = origin[i];

Или вы можете использовать memcpy():

memcpy(response, origin, sizeof response);

(Выше указано для C, Objective-C может иметь различия и другие способы делать то, что вы хотите сделать.)

...