Добавление к адресу массива в C

Это, наверное, очень обсуждаемый вопрос, но я до сих пор не понимаю механику:

Как мне добавить 512 к адресу массива?

Вот ситуация:

char buffer[512];
readSector(buffer,2);

/*somewhere in here i must increment address of buffer by 512*/

readSector(buffer,3);
printString(buffer);

readSector принимает в буферный массив и выгружает содержимое сектора 2 диска в него. Затем readSector вызывается снова для того, чтобы содержимое сектора 3 было сброшено в буфер. printString просто печатает содержимое буфера на экран.

Мой профессор объясняет, что каждый раз, когда я вызываю readSector, я должен увеличивать адрес буфера на 512. Как мне это сделать? Опять же, извините, если это явно очевидный вопрос или он был задан ранее. Спасибо!

5 ответов

Вы не можете увеличить массив. Однако вы можете создать указатель на первый элемент в массиве, а затем увеличить указатель:

char *ptr = &buffer[0];  // Or just char *ptr = buffer;

ptr += 512;

Однако, как указано ниже, ваш массив занимает всего 512 байт. Если вы увеличиваете на 512, вы смотрите за конец массива, который впоследствии вызовет неопределенное поведение.

Если вы увеличиваете buffer от 512 -> вы будете получать доступ к массиву за пределами. Попробуйте использовать матрицу:

...
char buffer[2][512]; 
readSector(buffer[0],2);
readSector(buffer[1],3);
...

Прежде всего, вы не должны пытаться получить доступ к массиву вне границ, то есть к области памяти после последнего адреса массива. Это неопределенное поведение

то есть в char buffer[512]; вы можете получить доступ только с *buffer до *(buffer +511),

Чтобы прочитать большие данные кратными 512 Вы можете прочитать первый набор данных в bufferраспечатайте его и перезапишите buffer со следующим набором данных, если старый набор данных не нужен. В противном случае вы можете предварительно выделить buffer быть большого размера (несколько 512 например 1024и т. д.), затем просто получите доступ к буферу как buffer для первого набора данных затем buffer + 512 для следующего набора данных, buffer + 512*2 для третьего и так далее.

Как уже отмечали другие, имя массива всегда указывает на базовый адрес массива, вы не можете его изменить, поэтому вам нужно использовать фиктивный указатель, скажем ptr для доступа к любому индексу в массиве.

char buf[1024];
char *ptr = buf;

readSector(ptr,2); // readSector(buf,2);

//buf = buf + 512; // Wrong, compile error
ptr = ptr + 512; // Correct!!

readSector(ptr,3);
printString(buffer);

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

1. Load the directory sector into a 512 byte character array using readSector
2. Go through the directory trying to match the file name.  If you do not find it, return.
3. Using the sector numbers in the directory, load the file, sector by sector, 
into the buffer array.
You should add 512 to the buffer address every time you call readSector
4. Return

Буферный массив на самом деле является массивом символов, инициализированным в main(), который установлен в

char buffer[13312];

Это означает, что просто компенсируя, я могу достичь того, чего хочу. Тем не менее, спасибо всем!

Ваша идея верна, только когда вы заявляете

 char buffer[512];

буфер становится константным типом, тат вы больше не можете увеличивать.

char * p = buffer;

Теперь это p то же самое, что и buffer, но это не константный тип, так что вы можете увеличивать p.

p += 3;

будет указывать на буфер плюс 3 места.

Другие вопросы по тегам