2013-10-24 7 views
3

Прямо сейчас я могу считать первое измерение, используя var_num=sizeof(var)/sizeof(var[0]);, который, кстати, я исследовал и использую мой код, но проблема в том, что я не знаю, как это работает, на моем выходе он показывает 20/4 = 5, и я не могу понять, откуда пришли эти 20 и 4, и я просто хочу спросить, как эти значения были получены от sizeof(var) и sizeof(var[0]), что означает этот нуль и относится ли это к 1-му или 2-му измерение?Измерение первого размера многомерного массива

#include <stdio.h> 
#include <conio.h> 
void main(){ 
char *var[][2]={ 
     {"var0-0","var0-1"}, 
     {"var1-0","var1-1"}, 
     {"var2-0","var2-1"}, 
     {"var3-0","var3-1"}, 
     {"var4-0","var4-1"}, 
     }; 
int var_num=sizeof(var)/sizeof(var[0]); 
clrscr(); 
printf("%d/%d = %d",sizeof(var),sizeof(var[0]),var_num); 
getch(); 
} 
+2

Этим значениям трудно поверить. Я получаю '40/8 = 5' на 32-битной машине. 40 - общий размер, 8 - размер одной записи (которая является символом 'char * [2]', поэтому у меня есть 5 элементов в первом измерении. Если вы делаете то же самое в одной строке, вы получаете '8/4 = 2', потому что одна строка состоит из 2 записей с 4 байтами каждый. – glglgl

+0

На 64-битной машине результаты: '80/16 = 5' соответственно. 16/8 = 2'. – glglgl

+0

Возможно, ваш результат исходит из прежняя версия вашей программы, в которой в массиве было меньше одного десятичного разряда. – glglgl

ответ

4

Давайте рассмотрим сложный пример для удовольствия. Скажем, мы в

char a[10][20][30] = { }; 

Размер a будет sizeof(char) * 10 * 20 * 30; так sizeof(a) = 6000 (as per C99 standard). a можно рассматривать как массив из (10) массива (20) массива из (30) символов. Теперь

  • a[0] будет один размер меньше, что дает нам множество (20) массива (30) символов
  • a[0][0] даст нам множество (30) символов
  • a[0][0][0] является характер.

Во всех этих примерах 0 - не что иное, как первый элемент соответствующего уровня массива.

Теперь найти длину массива, выполнив sizeof(a)/sizeof(a[0]), является трюком, укорененным в логике выше. sizeof(a[0]) - это не что иное, как размер массива из 20 массивов из 30 символов, что составляет 600. sizeof(a)/sizeof(a[0]) = 6000/600 = 10, что возвращает длину первого измерения. Аналогичную математику можно сделать и для более высоких измерений.

Поскольку в вашем вопросе у вас есть указатель типа char*, то в качестве базового фактора следует использовать sizeof(char*), который умножается на длины каждого измерения. Размер типа указателя зависит от типа машины/архитектуры и используемого вами компилятора.


У каждого из нас будут разные машины и разные компиляторы, работающие на них, поэтому нам нужна общая ссылка для объяснения. Запуск вашей программы в online compiler gives the result40/8 = 5. как я уже говорил выше, в зависимости от платформы и компилятора размер указателя будет отличаться.

Как вы писали в комментарии, ваш массив имеет тип char* [5][2].Отсрочка с [0] удалит один уровень, и у нас есть char* [2]; таким образом, sizeof(var[0]) = sizeof(char* [2]) = 8, скажем, что размер двух указателей на символы равен 8, что означает, что sizeof(char*) равно 4 на этом онлайн-машине. На этой основе sizeof(var) = 4 * 5 * 2 = 40, что мы видим на выходе, тем самым справедливо давая первую длину массива как 5.

Теперь ваш вывод, например mentioned by glglgl, немного отличается (возможно, ваш машина или модель данных компилятора - 16 бит); машина, с которой вы работаете в сочетании с вашим компилятором, кажется, дает как размер указателя char i.e sizeof(char*) = 2. Теперь, когда вы делаете var[0], у нас есть char* [2]; его размер равен sizeof(char*) * 2 = 2 * 2 = 4. Аналогично sizeof(var) = 2 * 5 * 2 = 20. Таким образом, вы получаете 20/4 = 5 как выход.

Как я могу узнать, сколько бит у меня есть на элемент 1-го измерения, я имею в виду подсчет?

В char* [5][2] каждый элемент первого измерения является типом char* [2], таким образом, это размер 2 * sizeof(char*).

Надеюсь, это поможет!

+0

Мне очень трудно понять это, извините, не могли бы вы объяснить далее, на мой случай, что я на у меня есть 2 измерения, и что мое 1-е измерение 5, второе - 2, также у вас есть мультипликация 20 на 30. Я это понимаю, но если бы я только получил свой var [0], там нет места, где можно было бы умножить это, ? – 707

+0

Обновлен ответ, чтобы уточнить вашу конкретную проблему. – legends2k

+0

Спасибо человеку, это действительно помогло! – 707

2

20 является размер вашего массива в байтах и ​​4 это размер одного элемента снова вашего массива в байтах. Массив имеет все его элементы одного и того же типа и, таким образом, того же размера, и поэтому вы получаете его длину, деля его размер на размер одного элемента. Вам не нужно использовать 0-й элемент, который вы можете использовать только с любым другим (если вы уверены, что есть элемент с таким индексом).

2

var[0] имеет тип char **, поэтому указатель. В 32-битных системах адрес занимает 4 байта, поэтому размер указателя равен 4.

sizeof(var) равно 20, потому что у вас есть 5 элементов в вашем массиве типа char **.

+0

'var [0]' представляет собой массив из двух символов 'char *'. Его размер должен быть 8 или 16. – pburka

1

«Что означает этот нуль?»

sizeof(var[0]) просит размер элемента в первом измерении. Ноль произвольный, но условный. Все элементы имеют одинаковый размер. Элемент 0 равен {"var0-0","var0-1"}, массив из двух указателей. Его размер, вероятно, будет 8 на 32-битной системе или 16 на 64-битной системе. Элемент 1 будет {"var1-0","var1-1"} и т. Д.

0

Ваши ответы помогли так много, я пришел к выводу, что один элемент моего 1-го измерения можно прочитать по-разному в зависимости от битовой системы, в которой я использую, где биты могут быть больше или меньше, но значения будут оставаться пропорциональными, и я все равно получаю то же значение.

+0

Но у меня есть вопрос: как я мог узнать, сколько бит у меня есть на элемент 1-го измерения, я имею в виду подсчет? – 707

Смежные вопросы