2017-01-29 6 views
-5
char foo[3] = { 97, 98, 97 }; 
printf("%d",sizeof(foo)); 

После отладки он дает мне результат 3.Почему не размер моего массива 4 байта C

Почему это не результат 4?

foo[3] состоит из 4 символов 0,1,2,3 вправо?

Размер символа 1 байт, так почему же нет foo 4 байта?

Почему нет результата 1?

Когда я звоню foo, это то же самое, что и звонок &foo[0]. Так как я знаю, когда я призываю весь массив и когда для первого символа? как здесь sizeof(foo)

+4

Три символа: 'foo [0], foo [1], foo [2]'. Вы просили 3, у вас есть 3. –

+2

Неверно. 'foo' состоит из 3 символов. – DyZ

+4

Где в мире вы получили '0, 1, 2, 3' из в' foo [3] '? –

ответ

0

Хорошо, я возьму этот один вопрос в то время ...

Почему не результат sizeof(foo) 4?

Это потому, что вы только установить размер foo массива 3 в первом заявлении char foo[3]. Не было бы причин ожидать 4 в результате, если вы явно определили оценку как 3 chars, которая составляет 3 байта.

Почему нет результата 1?

Вы правы, говоря, что в некоторых случаях, называя foo такое же, как &foo[0]. Наиболее актуальным из этих случаев для вашего вопроса является передача в качестве указателя функции в качестве параметра. В случае функции sizeof, когда вы передаете указатель на массив foo, функции итераторы по всему блоку памяти связаны с этим аргументированным указателем и возвращают общий размер, поэтому не является 1.

+0

Это не единственный основной случай. Арифметические выражения также приходят на ум. На самом деле, массивы чаще всего распадаются на указатели. An to nitpick 'sizeof' не является функцией, это оператор, и он не выполняет итерации. – StoryTeller

+0

@StoryTeller да, вы правы. Я упоминаю только пример параметра функции, поскольку он имеет отношение к его вопросу –

0

Я думаю, что вы путаетесь с размером массива и индексированием массива. Если вы объявите массив a размера 3 с линией char a[3];, он содержит три элемента, и к этим элементам обращаются как a[0], a[1] и a[2]. Это единственные элементы, которые существуют в массиве. a[3] был бы вне пределов.

0

foo[3] состоит из 4 символов 0,1,2,3 вправо?

No. Массив char, foo содержит три элемента: foo[0], foo[1], foo[2]. Так как символ всегда имеет размер 1 (не обязательно байта!), Массив из трех символов будет иметь размер 3.

Что касается вашего второго вопроса, this SO вопрос может пролить свет на него.