Другое дело: вместо того, чтобы делать предположения о размере вещей, используйте язык, чтобы рассказать вам.Например:
char *my_array[] = { "foo" , "bar" , "baz" , "bat" , } ;
// the size of an element of my_array
size_t my_array_element_size = sizeof(my_array[0]) ;
size_t alt_element_size = size(*my_array) ; // arrays are pointers under the hood
// the number of elements in my_array
size_t my_array_element_cnt = sizeof(my_array) / sizeof(*myarray ;
// the size of a char
size_t char_size = sizeof(*(my_array[0])) ; // size of a char
Другое дело: понять ваши структуры данных (как отмечено выше).Вы говорите о символах, но ваши структуры данных говорят о строках .Ваши объявления:
char *letters[] = {"a","b","c","d"};
char *buffer[4];
обрабатываются следующим образом:
letters
- это массив указателей на char (которые являются строками в стиле C с нулевым символом в конце),и он инициализируется 4 элементами. - Как и
letters
, buffer
- это массив из 4 указателей на символ, но не инициализирован.
На самом деле вы нигде не имеете дело с отдельными символамидаже в операторах printf()
: спецификатор %s
говорит, что аргумент является строкой с нулевым символом в конце.Скорее, вы имеете дело со строками (или указателями на char
) и их массивами.
Более простой способ:
#include <stdio.h>
int main(void)
{
char *letters[] = { "a" , "b" , "c" , "d" , } ;
size_t letter_cnt = size(letters)/sizeof(*letters) ;
char *buffer[sizeof(letters)/sizeof(*letters)] ;
for ( int i=0 , j=letter_cnt ; i < letter_cnt ; ++i )
{
buffer[--j] = letters[i] ;
}
printf("The alphabet: ");
for( int i = 0 ; i < letter_cnt ; ++i )
{
printf("%s",letters[i]);
}
printf("\n");
printf("The alphabet in reverse: ");
for( int i=0 ; i < letter_cnt ; i++ )
{
printf("%s",buffer[i]);
}
printf("\n");
}
Кстати, это домашняя работа?