2015-05-17 3 views
0

У меня есть код ниже, пытаясь понять выделение памяти под C. Замечания рядом с строкой указывают результат, который я получил. Тем не менее, я не знаю, как это сделать. Является ли этот стандарт? Если да, то как это подходит к этим возвращениям?Как C sizeof() возвращает эти значения


char *pk[] = {"12", "34", "56"}; 
int w[2][3] = {{1, 2, 3}, {4, 5, 6}}; 
int (*ppw)[2][3] = &w; 

char ch = "a"; 
int in = 10; 

int i = sizeof(ch); 
printf("SIZE OF CHAR IS %d\n",i); //1 

i = sizeof(in); 
printf("SIZE OF INT IS %d\n\n",i); //4 

int n = sizeof(pk); 
printf("%d\n",n); //24 

n = sizeof(*pk); 
printf("%d\n",n); //8 

n = sizeof(**pk); 
printf("%d\n",n); //1 

n = sizeof(ppw); 
printf("%d\n",n); //8 

n = sizeof(*ppw); 
printf("%d\n",n); //24 

n = sizeof(**ppw); 
printf("%d\n",n); //12 

+1

идти читать википедию первого – user3528438

+2

и 'символ CH = «a»; 'не делает то, что вы хотите сделать – user3528438

+2

Все эти размеры кажутся мне правильными, вы должны исправить эту строку:' char ch = "a"; 'должен читать' char ch = 'a'; ' – chqrlie

ответ

4

Ваша система имеет 8-байтовые указатели и 4-байтовые Интс. Напомним, что *p означает p[0]

sizeof(pk) является SizeOf массив из 3 указателей = 24

sizeof(*pk) является SizeOf первым указателем в массиве = 8

sizeof(**pk) является SizeOf (Char), который является 1

sizeof(ppw) - размер стрелки = 8

sizeof(*ppw) является SizeOf массива (3х2) целых чисел = 6 INTS = 24

sizeof(**ppw) является SizeOf массива (3) Интса = 3 Интса = 12

+0

Это прекрасное спасибо. Был сброшен 8-байтовыми указателями (не понял разницы между 32 и 64 бит) и «массив из трех указателей», а не «массив из трех символов». – liqiudilk

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