Tablica znaków w przypisaniu niezgodnym ze strukturą?
Próbowałem dowiedzieć się, czym tak naprawdę jest struct i napotkałem problem, więc mam naprawdę 2 pytania:
1) co jest zapisane w 'sara'? Czy jest to wskaźnik do pierwszego elementu struktury?
2) bardziej interesujące pytanie: dlaczego się nie kompiluje? GCC mówi " test.c: 10: error: incompatible types in assignment "and I can' t figure out why... (Ta część została już rozwiązana przez twoje odpowiedzi, świetnie!)
#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);
}
Dzięki za pomoc!
7 answers
Nie ma to nic wspólnego ze strukturami-tablice w C nie są przypisywalne:
char a[20];
a = "foo"; // error
Musisz użyć strcpy:
strcpy( a, "foo" );
Lub w kodzie:
strcpy( sara.first, "Sara" );
Lub możesz po prostu użyć alokacji dynamicznej, np.:
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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 12:12:54
Użyj strncpy
, aby upewnić się, że nie ma przepełnienia bufora.
char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 08:51:00
Możesz również zainicjować to w następujący sposób:
struct name sara = { "Sara", "Black" };
Ponieważ (jako szczególny przypadek) możesz inicjalizować tablice znaków ze stałych łańcuchów.
Teraz, co do tego, czym właściwie jest struktura-jest to typ złożony złożony z innych wartości. To, co sara
faktycznie wygląda w pamięci, to blok zawierający 20 kolejnych wartości znaków (do których można się odnieść używając sara.first
, po którym następuje 0 lub więcej bajtów wypełnienia, a następnie kolejny blok zawierający 20 kolejnych wartości znaków (które mogą być określone za pomocą sara.last
). Wszystkie pozostałe instancje typu struct name
są ułożone w ten sam sposób.
W tym przypadku jest bardzo mało prawdopodobne, że istnieje jakiekolwiek wypełnienie, więc struct name
jest tylko blokiem 40 znaków, dla którego masz nazwę dla pierwszych 20 i ostatnich 20.
Możesz dowiedzieć się, jak duży blok pamięci zajmuje struct name
używając sizeof(struct name)
, i możesz dowiedzieć się, gdzie w tym bloku pamięci znajduje się każdy element struktury używając offsetof(struct name, first)
i offsetof(struct name, last)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 09:22:49
sara
jest strukturą, a nie wskaźnikiem (tzn. zmienną reprezentującą położenie na stosie, w którym przechowywane są rzeczywiste dane struktury). Dlatego *sara
jest bez znaczenia i nie będzie kompilowany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 08:51:22
Struktura Sara jest blokiem pamięci zawierającym zmienne wewnątrz. Nie ma prawie żadnej różnicy między klasycznymi deklaracjami:
char first[20];
int age;
I struktura:
struct Person{
char first[20];
int age;
};
W obu przypadkach po prostu przydzielasz trochę pamięci do przechowywania zmiennych, a w obu przypadkach będzie 20 + 4 bajty zarezerwowane. W Twoim przypadku Sara jest tylko blokiem pamięci 2x20 bajtów.
Jedyną różnicą jest to, że w strukturze pamięć jest alokowana jako pojedynczy blok, więc jeśli weźmiesz początkowy adres Sary i przeskoczyć 20 bajtów, znajdziesz" ostatni " zmienną. Czasami może to być przydatne.
Sprawdź http://publications.gbdirect.co.uk/c_book/chapter6/structures.html Po Więcej:).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 09:18:23
Możesz użyć strcpy, aby go wypełnić. Możesz również zainicjować go z innej struktury.
#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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-25 07:06:46