Ответ 1
Это не имеет ничего общего с structs - массивы в C не могут быть назначены:
char a[20];
a = "foo"; // error
вам нужно использовать strcpy:
strcpy( a, "foo" );
или в вашем коде:
strcpy( sara.first, "Sara" );
Я попытался выяснить, какая структура действительно "есть" и попала в проблему, поэтому у меня действительно есть 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);
}
Спасибо за вашу помощь!
Это не имеет ничего общего с structs - массивы в C не могут быть назначены:
char a[20];
a = "foo"; // error
вам нужно использовать strcpy:
strcpy( a, "foo" );
или в вашем коде:
strcpy( sara.first, "Sara" );
Или вы можете просто использовать динамическое размещение, например:
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);
используйте strncpy
, чтобы убедиться, что у вас нет переполнения буфера.
char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;
sara
- это сама структура, а не указатель (т.е. переменная, представляющая местоположение в стеке, где хранятся фактические данные структуры). Поэтому *sara
не имеет смысла и не будет компилироваться.
Вы также можете инициализировать его следующим образом:
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)
.
Структура 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 для получения дополнительной информации:).
Вы можете использовать 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);
}