Элементы (которые массив типа char) структур изменению не подлежат! А их можно только инициализировать! (Так?)

Модератор: Модераторы разделов

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Элементы (которые массив типа char) структур изменению не подлежат! А их можно только инициализировать!

Сообщение promov »

Друзья! Вот рабочаяя программа
#include <stdio.h>

Код: Выделить всё

int main () {
 struct a {
  int b;
 };
 struct a c;
  c.b= 6;
  c.b= 34;
 return 0;
}


Видно, что описана структура a (для простоты в неё входит всего один элемент), а потом объявлена переменная c структурного типа. А после первый и единственный элемент c.b этой переменной 1) инициализирован значением 6; 2) Значение элемента с.b изменено на 34.
Если член структуры будет массив элементов типа char, то не то что изменения, инициализации никакой не произойдёт. Действительно, эта программа нерабочая

Код: Выделить всё

#include <stdio.h>
int main () {
 struct a {
  char b [4];
 };
 struct a c;
  c.b= "hjh";
 return 0;
}


Бесполезно также инициализировать c.b так: c.b= {'h', 'j', 'h'}; или так: c= {.b= "hjh"};
Единственный способ инициализировать c.b- сделать это при объявлении переменной с. И это способ именно инициализации, но никак не изменения. Действительно вот рабочая программа

Код: Выделить всё

#include <stdio.h>
int main () {
 struct a {
  char b [4];
 };
 struct a c= {.b= "jhj"};
 return 0;
}


Всё. В дальнейшем элемент c.b невозможно изменить никоим образом, он как стал первоначально jhj, так jhj и остаётся. А если бы с.b был, например, типа int, тогда пожалуйста, изменяй. В книгах ничего о возможности или невозможности такого изменения не сказано, там только сказано как обратиться к такому элементу переменной: с.b. Получается, такое вот обращение только для одного и может послужить- для напечатания значения c.b. А вот возможно ли к нему обратиться, чтобы его изменить, если он массив типа char... Впрочем, я повторяюсь. Итак, возможно ли его изменить, как Вы это знаете? Может, так и должно быть, просто авторы на это внимание своё не обратили? Cпасибо.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Элементы (которые массив типа char) структур изменению не подлежат! А их можно только инициализировать!

Сообщение Uncle_Theodore »

Вы путаете инициализацию массивов (которая может быть сделана "сразу для всего массива") и изменение массива, которое должно быть сделано поэлементно. К структурам данный вопрос не имеет отношения. Вот, смотрите:

Код: Выделить всё

#include <stdio.h>

int main () {
struct a {
  char b [4];
};

struct a c;
  c.b[0] = 'h';
  c.b[1] = 'j';
  c.b[2] = 'h';
  c.b[3] = 'q';

  printf("c.b[2]=%c\n", c.b[2]);

  c.b[2] = 'z';

  printf("c.b[2]=%c\n", c.b[2]);

return 0;
}


Или вот, как Вам хотелось

Код: Выделить всё

#include <stdio.h>

int main () {
struct a {
  char b[4];
};

struct a c ={.b = {'a','b','c','d'}};

  printf("c.b[2]=%c\n", c.b[2]);

  c.b[2] = 'z';

  printf("c.b[2]=%c\n", c.b[2]);

return 0;
}
Спасибо сказали: