Следующий фрагмент кода должен ответить на ваш вопрос:
#include <stdio.h>
#include <string.h>
void foo(char *msg){
printf("\n");
printf("Sizeof MSG = %zu\n", sizeof(msg));
printf("Length of MSG = %zu\n", strlen(msg));
}
int main(void) {
char msg[10] = "Michi";
printf("Sizeof MSG = %zu\n", sizeof(msg));
printf("Length of MSG = %zu\n", strlen(msg));
foo(msg);
return 0;
}
Выход:
Sizeof MSG = 10
Length of MSG = 5
Sizeof MSG = 8
Length of MSG = 5
Почему Sizeof MSG = 10
внутри main
? Потому что вы печатаете размер массива.
Почему Sizeof MSG = 8
внутри foo
? Потому что вы печатаете размер указателя, который на вашей машине (например, мой) бывает 8
.
Массивы распадаются на указатель на свой первый элемент, когда используются как аргументы функции.
Другими словами, такие вещи, как это:
#include <stdio.h>
#include <string.h>
void foo(int *msg){
printf("\n");
printf("Sizeof MSG = %zu\n", sizeof(msg));
printf("Length of MSG = %zu\n", strlen(msg));
}
int main(void) {
int msg[10] = {1,2,3,4,5};
printf("Sizeof MSG = %zu\n", sizeof(msg));
printf("Length of MSG = %zu\n", strlen(msg));
foo(msg);
return 0;
}
не будет работать, и, возможно, ваш компилятор предупредит вас о том, что:
error: passing argument 1 of ‘strlen’ from incompatible pointer type
Поскольку strlen
определяется следующим образом:
size_t strlen(const char *str)
Как вы можете видеть strlen
необходимо char*
, а не int*
.
Чтобы исправить это вам нужно передать длину тоже, как это:
#include <stdio.h>
#include <string.h>
void foo(int *msg, size_t length){
size_t i=0;
printf("\n\n");
printf("Sizeof MSG = %zu\n",length);
for (i = 0; i<length;i++){
printf("%d ",msg[i]);
}
}
int main(void) {
int msg[] = {1,2,3,4,5,6,7,8,9,10};
size_t length = sizeof msg/sizeof msg[0];
size_t i=0;
printf("\n");
printf("Sizeof MSG = %zu\n",length);
for (i = 0; i<length;i++){
printf("%d ",msg[i]);
}
foo(msg, length);
return 0;
}
Выход:
Sizeof MSG = 10
1 2 3 4 5 6 7 8 9 10
Sizeof MSG = 10
1 2 3 4 5 6 7 8 9 10
Возможный дубликат [Как найти «sizeof» (указатель, указывающий на массив)?] (Http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing -to-an-array) – BlackDwarf