Я изучаю структуры и натолкнулся на какое-то недопонимание.Я написал пару примеров:
#include <stdio.h>
struct test{
char field[16];
};
int main(int argc, char * argv[]){
const char *string = "some string";
struct test t1 = {.field = *string};
struct test t2 = {.field = string};
struct test t3 = {.field = "some string"};
struct test t4 = {{'s', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'}};
printf("t1::field = %s\n", t1.field); //prints s
printf("t2::field = %s\n", t2.field); //prints garbage character
printf("t3::field = %s\n", t3.field); //prints some string
printf("t4::field = %s\n", t4.field); //prints some string
}
Вывод:
t1::field = s
t2::field = 4
t3::field = some string
t4::field = some string
ideone
Другой пример -
#include <stdio.h>
struct test{
char field[16];
};
int main(void) {
const char *string = {'s', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
struct test t = {.field = *string};
printf("t::field = %s\n", t.field); //segfault
}
Вывод пуст.
ideone
Поведение мне не совсем понятно.При выделении памяти массива мы можем принять его n-й элемент как arr[n]
, который расширяется до *(arr + n)
.Поэтому я ожидал, что мы инициализируем char field[16]
некоторыми char *
, и этого будет достаточно, чтобы рассматривать объект, на который указывает указатель, как первый элемент некоторого массива.
Но, судя по поведению, мое пониманиебыл совершенно неправНе могли бы вы дать краткое объяснение этого?