Поведение Sizeof в C - PullRequest
       11

Поведение Sizeof в C

5 голосов
/ 25 июля 2011

Я узнал, что когда мы передаем имя массива в sizeof, имя массива не затухает до указателя на базовый адрес. Приведенный ниже код подтверждает этот факт, давая ответ 10.

#include <stdio.h> 

int main(){  
    int arr[10];  
    printf("Size of array is %d" , sizeof(arr)/sizeof(int));  
    return 0;  
}

Однако, когда я запускаю приведенный ниже код, ответ приходит 1. Независимо от того, записано ли измерение в прототипе или нет, ответ равен 1. Почему это так?

#include <stdio.h>

void dimension(int arr[]){  
    printf("Sizof array is %d" , sizeof(arr)/sizeof(int));  
}


int main(){  
    int arr[10];  
    dimension(arr);  
    return 0;  
}  

Ответы [ 8 ]

5 голосов
/ 25 июля 2011

Эта подпись

void dimension(int arr[])

равно абсолютно эквивалентно

void dimension(int *arr)

См. Также Вопрос 6.4

4 голосов
/ 25 июля 2011

Потому что вы передаете массив неизвестного размера, который эквивалентен указателю в этом контексте. sizeof рассчитывается при времени компиляции , а не времени выполнения.

2 голосов
/ 25 июля 2011

Когда массив передается функции, он передается как указатель, а не как массив, поэтому sizeof(arr) вернет sizeof(int *)

1 голос
/ 25 июля 2011

В

void dimension(int arr[]){  
    printf("Sizof array is %d" , sizeof(arr)/sizeof(int));  
}

arr[] распадается на указатель, поэтому у вас есть эквивалент

printf("Sizof array is %d" , sizeof(int*)/sizeof(int));

, и потому на вашей платформе sizeof(int*) == sizeof(int) вы получаете 1 как результат.

Обратите внимание, что для массивов переменной длины sizeof становится операцией времени выполнения:

int main () {
    int i = ...;
    int x[i];
    printf("number of elements: %d", sizeof (x) / size(*x));
}
1 голос
/ 25 июля 2011

Массивы в качестве аргументов функции do затухание до указателя.Так как это происходит до вызова sizeof (), вы не можете предотвратить это.

Подумайте об этом: как sizeof () может узнать размер массива, если можно передать любой размерный массив и никакой дополнительной информации нет?Вы получаете sizeof (указатель), и он, кажется, совпадает с размером int в вашей настройке.

0 голосов
/ 25 июля 2011

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

0 голосов
/ 25 июля 2011

Возвращает размер указателя, который является целым числом.

0 голосов
/ 25 июля 2011

потому что arr является указателем, который является целым числом.

...