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!

Author: Patrick, 2009-08-18

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" );
 57
Author: ,
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:37:16

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);
 8
Author: Scott Gardner,
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;
 4
Author: TimW,
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).

 3
Author: caf,
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.

 2
Author: Pavel Minaev,
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:).

 0
Author: gramm,
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);

}
 0
Author: Xofo,
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