Подтвердить что ты не робот

Char массив в структуре - несовместимое задание?

Я попытался выяснить, какая структура действительно "есть" и попала в проблему, поэтому у меня действительно есть 2 вопроса:

1) Что сохраняется в 'sara'? Является ли это указателем на первый элемент структуры?

2) Более интересный вопрос: почему он не компилируется? GCC говорит: "test.c: 10: ошибка: несовместимые типы при назначении", и я не могу понять, почему... (Эта часть уже решена вашими ответами, отлично!)

#include <stdio.h>

struct name {
    char first[20];
    char last[20];
};

int main() {
    struct name sara;
    sara.first = "Sara";
    sara.last = "Black";
    printf("struct direct: %x\n",sara);

    printf("struct deref: %x\t%s\n", *sara, *sara);


}

Спасибо за вашу помощь!

4b9b3361

Ответ 1

Это не имеет ничего общего с structs - массивы в C не могут быть назначены:

char a[20];
a = "foo";   // error

вам нужно использовать strcpy:

strcpy( a, "foo" );

или в вашем коде:

strcpy( sara.first, "Sara" );

Ответ 2

Или вы можете просто использовать динамическое размещение, например:

struct name {
  char *first;
  char *last;
};

struct name sara;
sara.first = "Sara";
sara.last = "Black";
printf("first: %s, last: %s\n", sara.first, sara.last);

Ответ 3

используйте strncpy, чтобы убедиться, что у вас нет переполнения буфера.

char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;

Ответ 4

sara - это сама структура, а не указатель (т.е. переменная, представляющая местоположение в стеке, где хранятся фактические данные структуры). Поэтому *sara не имеет смысла и не будет компилироваться.

Ответ 5

Вы также можете инициализировать его следующим образом:

struct name sara = { "Sara", "Black" };

Так как (как частный случай) вам разрешено инициализировать массивы char из строковых констант.

Теперь, что касается структуры на самом деле - это составной тип, состоящий из других значений. То, что на самом деле выглядит sara в памяти, представляет собой блок из 20 последовательных значений char (которые можно отнести к использованию sara.first, за которыми следуют 0 или более байтов заполнения, а затем следующий блок из 20 последовательных значений char который может быть отнесен к использованию sara.last). Все остальные экземпляры типа struct name выложены таким же образом.

В этом случае очень маловероятно, что есть отступы, поэтому struct name - это всего лишь блок из 40 символов, для которого у вас есть имя для первых 20 и последних 20.

Вы можете узнать, как большой блок памяти struct name использует sizeof(struct name), и вы можете узнать, где в этом блоке памяти каждый элемент структуры размещается при использовании offsetof(struct name, first) и offsetof(struct name, last).

Ответ 6

Структура Sara представляет собой блок памяти, содержащий переменные внутри. Между классическими объявлениями почти нет разницы:

char first[20];
int age;

и структура:

struct Person{
char first[20];
int age;
};

В обоих случаях вы просто выделяете некоторую память для хранения переменных, и в обоих случаях зарезервировано 20 + 4 байта. В вашем случае Sara - это всего лишь блок памяти 2x20 байт.

Единственное отличие состоит в том, что со структурой память выделяется как один блок, поэтому, если вы берете начальный адрес Sara и прыгаете 20 байтов, вы найдете "последнюю" переменную. Иногда это может быть полезно.

проверить http://publications.gbdirect.co.uk/c_book/chapter6/structures.html для получения дополнительной информации:).

Ответ 7

Вы можете использовать strcpy для его заполнения. Вы также можете инициализировать его из другой структуры.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct name {
    char first[20];
    char last[20];
};

int main() {
    struct name sara;
    struct name other;

    strcpy(sara.first,"Sara");
    strcpy(sara.last, "Black");

    other = sara;

    printf("struct: %s\t%s\n", sara.first, sara.last);
    printf("other struct: %s\t%s\n", other.first, other.last);

}