Форум программистов, компьютерный форум CyberForum.ru

Массив символов в структуре - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
24.03.2010, 01:42     Массив символов в структуре #1
Подскажите, пожалуйста, как объявить структуру, в которой первый элемент - массив массивов символов (например:
werrtyfg
sdf
sgfdh),
второй и третий элементы - целочисленные массивы? Все массивы динамические. И как выделить для них память?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.03.2010, 06:54     Массив символов в структуре #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdlib.h>
 
struct arrays {
    char **charr;
    int nlines, lsize;
 
    int *iarr1;
    int iasize1;
 
    int *iarr2;
    int iasize2;
};
 
...
 
    struct arrays s;
 
    s.nlines = 3;
    s.lsize = 100;
    s.iasize1 = 10;
    s.iasize1 = 20;
 
    s.charr = (char **) malloc(s.nlines*sizeof(char *));
    /* выделил память - проверь её на NULL */
 
    s.charr[0] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
    s.charr[1] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
    s.charr[2] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    s.iarr1 = (int *) malloc(s.iasize1*sizeof(int));
    /* выделил память - проверь её на NULL */
    s.iarr2 = (int *) malloc(s.iasize2*sizeof(int));
    /* выделил память - проверь её на NULL */
размер можно и снаружи хранить
но тогда нельзя сделать разные структуры с разными размерами (путанее получится)
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
24.03.2010, 08:12  [ТС]     Массив символов в структуре #3
Спасибо большое!
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
26.03.2010, 16:39  [ТС]     Массив символов в структуре #4
А можно ли чтоб количество строк было динамическое, а строка статический массив символов? Если да, то как объявить и выделить память?

Добавлено через 2 часа 41 минуту
И ещё одна проблемка: если я записываю допустим в s.charr[2] какую-нить строку, то эта же строка записывается и в s.charr[0], и в s.charr[1], а мне так не надо))
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
26.03.2010, 19:06     Массив символов в структуре #5
Значит, при всём моём уважении к accept, ответа на вопрос получено не было.
Во-первых, что за массив указателей?
Ячно было сказано, три массива: массив символов и два целочисленных. О массиве указателей на символы речь не шла.

НО это ладно, допустим, кашу маслом не испортигь. Но! Самое главное, я не увидел, чтобы
размеры массивом МОЖНО БЫЛО ВВОДИТЬ ВО ВРЕМЯ ИСПОЛНЕНИЯ ПРОГИ!

А ведь именно такая возможность и делает динамические массивы таковыми. Короче, вот как надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include <stdio.h>
 
 
int main() {
                SetConsoleCP(1251);
                SetConsoleOutputCP(1251); 
 
 //ИТак, структурка
 struct to_chto_nado {
  char* ukaz_na_sim;
  char* ukaz_na_int_1;
  char* ukaz_na_int_2;
 } vot_ono;
 
 
 //ЭТо вот и есть те самые динамически переменные
 int kol_vo_sim;   
 int kol_vo_int_1;   
 int kol_vo_int_2;
 
 printf ("Вводи количество символов потом количество чисел и ещё одно через пробелы\n");
 scanf ("%d%d%d", &kol_vo_sim, &kol_vo_int_1, &kol_vo_int_2);   
 
 //Можешь расскоментировать и проверить
 //printf ("\nkol_vo_sim= %d   kol_vo_int_1= %d  kol_vo_int_2=  %d", kol_vo_sim, kol_vo_int_1, kol_vo_int_2);   
 
 //Теперь собсно массивы
 vot_ono.ukaz_na_sim= new char [kol_vo_sim];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_1];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_2];
 
//Тут пеоарботали, 
//....................
 
//а теперь память освобождаем
 delete [] vot_ono.ukaz_na_sim;
 delete [] vot_ono.ukaz_na_int_1;
 delete [] vot_ono.ukaz_na_int_2;
 
//Всё!
    getchar ();
    getchar ();
    /*конец*/ 
 return 0;
}
Кстати, тас по-моему сам не знгает чего хочет. В его последнем сообщении идёт речь о количестве строк.
Каких строк, позвольте спросить? Заявлена ОДНА строка- массив символов. Всё!
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
26.03.2010, 20:27  [ТС]     Массив символов в структуре #6
Мне нужен не просто массив символов, а массив массивов символов, где первый индекс - номер строки, а второй - символа в этой строке. Например:
sdfg
asd
as
fgdfg

Количество строк должно быть динамическое, а количество символов или динамическое, или статическое.

Просто в текстовике у меня будет инфа типа:
fg 56 566
sfgd 555 7
wer 546 567

И мне нужно кинуть эту инфу в структуру. Я всё смогу сделать, кроме как выделить норм память...

А размеры кстати вводить не надо, у меня размер - количество строк в текстовике
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
27.03.2010, 06:21     Массив символов в структуре #7
На C++ это достаточно просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
struct txt2struct
{
    std::vector<std::string>    sarray;
    std::vector<int>            iarray1;
    std::vector<int>            iarray2;
    friend std::istream& operator>>(std::istream& is, txt2struct& s);
    friend std::ostream& operator<<(std::ostream& os, const txt2struct& s);
    void clear();
};
 
std::istream& operator>>(std::istream& is, txt2struct& s)
{
    if(is==NULL)
        throw(std::exception("An attempt to access the input stream has failed"));
    while(!is.eof())
    {
        std::string ts;
        int ti1, ti2;
        is >> ts >> ti1 >> ti2;
        //Если читаем из консольного потока, и нажали ctrl+z
        if(is.eof())
            break;
        if(is.bad())
            throw(std::exception("Error reading the input stream"));
        s.sarray.push_back(ts);
        s.iarray1.push_back(ti1);
        s.iarray2.push_back(ti2);
    }
    return is;
}
 
std::ostream& operator<<(std::ostream& os, const txt2struct& s)
{
    if(os==NULL)
        throw(std::exception("An attempt to access the output stream has failed"));
    for(size_t i=0; i<s.sarray.size(); ++i)
    {
        os << s.sarray[i] << " " << s.iarray1[i] << " " << s.iarray2[i] << std::endl;
        if(os.bad())
            throw(std::exception("Error writing to the output stream"));
    }
    return os;
}
 
void txt2struct::clear()
{
    sarray.clear();
    iarray1.clear();
    iarray2.clear();
}
 
int main()
{
    try
    {
        txt2struct s;
        std::ifstream ifs("input.txt");
        //Ввод структуры из файла
        ifs >> s;
        //Добавление в структуру из консоли
        std::cin >> s;
        //Вывод содержимого в консоль
        std::cout << s;
        //Можно очищать структуру
        s.clear();
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        system("pause");
        return 1;
    }
    system("pause");
    return 0;
}
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
27.03.2010, 09:31  [ТС]     Массив символов в структуре #8
Так то оно может и просто, но С++ я ток начал изучать, и поэтому нужно что-то типа того, что написал accept или kravam... А за std мня в универе заставят переделывать
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
27.03.2010, 17:17     Массив символов в структуре #9
Цитата Сообщение от stratovarius Посмотреть сообщение
Мне нужен не просто массив символов, а массив массивов символов, где первый индекс - номер строки, а второй - символа в этой строке. Например:
sdfg
asd
as
fgdfg
Слушай, автор, ты тень на плетень не наводи. Определяйся давай с условием и не путай людей и сам не путайся
Если у тебя будет массив массивов символов, то первый элемент никак не может быть номером строки. Первый элемент (как и любой другой)- массив символов! Согласно заявленному!

То же самое и со вторым элементом.

(Ну или адрес нулевого элемента, чтобы к словам не прикапывались.)

Добавлено через 29 минут
Дальше. В строке будет статическиое количество символов или динамическое?
ТОже непонятно.
Короче, вот тебе то, что ты просил вчера.
МАссив строк динамический, сама строка статична.

Итак, пояснения.
С динамическим массивом умеютработать все, синтаксис простой

C++
1
2
char* p= new char [5]
 delete [] p;
В нашем случае мы формируем динамический массив строк. Следовательно, переменная p должна иметь тип : строка такая-то. А ещё точнее: строки из стольки-то символов.
Такого типа в языке C нет, поэтому вводим его сами (не синоним имени типа а новывй тип!)

НОвый типа объявляеться с помощью struct
Итак, поехали

C++
1
2
3
4
5
6
struct p {
 char a1;
 char a2;
 ...
 char aN;
}
Теперь а- новый тип, а объявление

C++
1
p stroka
дастпеременную такоготипа, то есть массив из NHJ символов. НО, понятное дело, что это не наш метод, поэтому поправим объявление ноговго типа:

C++
1
2
3
struct p {
 char a1 [N];
}
Теперь чтобы выделить память, дропустим, для 5-ти строк, надо вот так вот записать: (цифра 5 вводится с клавиатуры- вот она, динамика.)
C++
1
p* stroka= new p [5]
Теперь переменная styroka будет указыватьна нулевой символ массива 5 строк из N символов
Что я и делаю в коде, с учётом того, что массив строк есть член структуры.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <windows.h>
#include <stdio.h>
#define kolvo_sim_v_stroke
 
int main() {
                SetConsoleCP(1251);
                SetConsoleOutputCP(1251); 
 
 //НОвый тип "массив символов из kolvo_sim_v_stroke элементов"
 //Это статический массив
 struct mas_sim_iz_skolki_to_tam_elementov {
  char mas [kolvo_sim_v_stroke];
 };  
 
 //ИТак, структурка
 struct to_chto_nado {
 
  
  //А это динамический массив. То есть указатель на переменную 
  //типа "массив символов из kolvo_sim_v_stroke элементов", котоорый я ввёл выше
  mas_sim_iz_skolki_to_tam_elementov* ukaz_na_massiv_strok;
  
  
  char* ukaz_na_int_1;
  char* ukaz_na_int_2;
 } vot_ono;
 
 
 //ЭТо вот и есть те самые динамически переменные
 int kol_vo_strok;   
 int kol_vo_int_1;   
 int kol_vo_int_2;
 
 printf ("Вводи количество символов потом количество чисел и ещё одно через пробелы\n");
 scanf ("%d%d%d", &kol_vo_strok, &kol_vo_int_1, &kol_vo_int_2);   
 
 //Можешь расскоментировать и проверить
 //printf ("\nkol_vo_sim= %d   kol_vo_int_1= %d  kol_vo_int_2=  %d", kol_vo_sim, kol_vo_int_1, kol_vo_int_2);   
 
 //Теперь собсно массивы
 vot_ono.ukaz_na_massiv_strok= new mas_sim_iz_skolki_to_tam_elementov [kol_vo_strok];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_1];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_2];
 
//Тут пеоарботали, 
//....................
 
//а теперь память освобождаем
 delete [] vot_ono.ukaz_na_massiv_strok;
 delete [] vot_ono.ukaz_na_int_1;
 delete [] vot_ono.ukaz_na_int_2;
 
//Всё!
    getchar ();
    getchar ();
    /*конец*/ 
 return 0;
}
Добавлено через 4 минуты
Фиг поправишь, если есть код. Вот это вот:
"Теперь а- новый тип, а объявление"

НАдо понмать как
"Теперь p- имя нового типа новый тип, а объявление"

ВМесто NHJ читать N

Добавлено через 1 минуту
ВСё компильнулось, компилятор не ругался, хотя чёрт его знает, может где подводные камни есть, Автор тестируй, неудачные результаты сюда.
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
27.03.2010, 21:41  [ТС]     Массив символов в структуре #10
Спасибо огромное! Обязательно протестирую, но не сегодня, а где-то через пару деньков... Просто непредвиденные семейые обстоятельства не дают этого сделать...
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.03.2010, 04:04     Массив символов в структуре #11
Цитата Сообщение от stratovarius
А можно ли чтоб количество строк было динамическое, а строка статический массив символов? Если да, то как объявить и выделить память?
а там оно не динамическое ?
ты выделил массив, указал сколько там строк, потом удалил массив и выделил новый, новое количество строк записал туда
таким образом в структуре хранится указатель на динамический массив и текущее количество строк в нём
массив ещё может хранится вообще без количества строк (это выделяется массив указателей на строки и ещё один указатель в конце, куда записывается нулевой указатель, маркер конца массива)
можно сделать переменную, которая хранит количество строк, динамической (для неё будет выделяться память), тогда она будет в виде указателя, а он по размеру часто равен размеру самой переменной

Цитата Сообщение от stratovarius
И ещё одна проблемка: если я записываю допустим в s.charr[2] какую-нить строку, то эта же строка записывается и в s.charr[0], и в s.charr[1], а мне так не надо))
а как ты записываешь ?
надо через strcpy()

C
1
2
3
4
5
6
7
8
    s.charr[0] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    ...
 
    strcpy(s.charr[0], "abcd");
 
    strcpy(s.charr[1], "efgh");
вообще через strncpy(), так как у строки есть ограничение, но тогда не забывать ставить нуль-символ

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    s.charr[0] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    s.charr[1] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    ...
 
    n = strlen("abcd") % s.lsize;
 
    strncpy(s.charr[0], "abcd", n);
 
    s.charr[0][n] = '\0';
 
    n = strlen("efgh") % s.lsize;
 
    strncpy(s.charr[1], "efgh", n);
 
    s.charr[0][n] = '\0';
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
29.03.2010, 16:10  [ТС]     Массив символов в структуре #12
kravam, всё отлично, память выделяется норм, вот только нельзя работать со стандартными функциями для строк (например, strcpy), если переменная объявлена типа mas_sim_iz_skolki_to_tam_elementov, ошибка: c Cannot convert mas_sim_iz_skolki_to_tam_elementov to char*...

Либо посмотри мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
 
struct string
{
  char str[15];
};
 
struct structure
{
    string *group;
    int *mass;
    int *days;
};
 
structure s;
 
char *CutString(char *line)
{
  char *temp;
  strtok(line," ");
  strcpy(temp,line);
  memmove(line,line+strlen(line)+1,strlen(line));
  return temp;
} 
 
void main()
{
  int i,count=0;
  FILE *file;
  char *line;
 
  clrscr();
 
  file=fopen("in.txt","r");
  while (!feof(file))
  {
    fgets(line,15,file);
    count++;
  }
  fclose(file);
 
  s.group = new string[count];
  s.mass = new int[count];
  s.days = new int[count];
 
  file=fopen("in.txt","r");
  for (i=0; !feof(file); i++)
  {
    fgets(line,15,file);
    s.group[i]=CutString(line);
    s.mass[i]=atoi(CutString(line));
    s.days[i]=atoi(line);
  }
  fclose(file);
 
  delete[]s.group;
  delete[]s.mass;
  delete[]s.days;
 
  getch();
}
В 55 строке ошибка: Cannot convert char* to string
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
29.03.2010, 18:39     Массив символов в структуре #13
Так а надо ли оно тебе?
Смотри, во первых, CutString возвращает указатель на char, а s.group[i] имеет тип string. Так что ничё не выйдет.

Если ты хочешь все соки выжать из s.group[i], тогда смотри, вот если мы напишем вот так:
s.group[i].str[0] или вот так s.group[i].str[1] так или вот так s.group[i].str[2], то всё будет работать ОК, эти записи корректны (вплоть до s.group[i].str[14], хе, впрочем s.group[i].str[15] тоже сработает, но ну его на фиг)

Теперь смотри, ты возвращаешь адрес на строку. Куда ты реально можешь его запихать? Особых вариантов я не вижу, вышеперечисленные переменные- элементы массива str, имеют тип char (а возвращается, напомню, указател на char).

Так что извини, каким боком массив символов относится к указателю на char, мне непонятно.

А если ты подразумеваешь, что переменная s.group[i].str суть адрес нулевого элемента массива и в эту переменную неплохо было бы вернуть значение, возвращаемое CutString, то вынужден тебя огорчить. Понимаешь, в чём дело, вот это сработает:

C++
1
char* per= s.group[i].str
ТО есть тут всё понятно, переменной per мы присвоили адрес нулевого элемента массива str

Но по этому адресу ты прописать ничего не сможешь потому, что такой переменной (s.group[i].str) просто нет! Памяти для неё не выделено! Вот это просто не сканает:

C++
1
s.group[i].str=  CutString
Ну, я думаю суть ты уловил. Когда s.group[i].str в правой части оператора присваивания, то прога нормально высчитывает адрес нулевого элемента, а когда в левой- извини, нет такой переменной s.group[i].str.

Чё делаем?
Я что-то не могу уловить, почему тебе просто вместо массива не объявить указатель на строку, вот так:
struct string
{
char* str;
};

И с ним не работать? В суть программы не вникал, но вот это сканало бы тогда:
s.group[i].str= CutString(line);

Добавлено через 13 минут
Хм, последний вариант очень даже ничего.
Но если тебе кровь из носа надо, чтобы возвращённая строка размещалась именно в этих 15-ти элементах... Тогда просто скопируй её и всё:
C++
1
2
3
4
5
6
7
8
struct string
{
  char str[15];
};
 
//Код всякий
 
strcpy (s.group[i].str, CutString(line));
...Как говорится, всего, и делов, то.
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
29.03.2010, 19:14  [ТС]     Массив символов в структуре #14
Yahooooo!!!!! Спасибо тебе огромное!!! Всё работает!
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
29.03.2010, 19:16     Массив символов в структуре #15
Хе, чё-то я наговорил... И надо- то было последний вариант предложить. Ну, ничего, главное, чтобы был в коня корм.
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
30.03.2010, 15:10  [ТС]     Массив символов в структуре #16
А можно вместо
Цитата Сообщение от kravam Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
struct string
{
  char str[15];
};
 
//Код всякий
 
strcpy (s.group[i].str, CutString(line));
написать
C++
1
2
3
4
5
typedef char string[15];
 
//Код всякий
 
strcpy (s.group[i], CutString(line));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2010, 18:33     Массив символов в структуре
Еще ссылки по теме:

Обращение к динамической структуре через массив указателей C++
Массив в структуре. invalid use of non-static data member C++
В структуре хранятся следующие данные об учениках: фамилия, имя, отчество, рост, масса. Создать массив стру C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
30.03.2010, 18:33     Массив символов в структуре #17
Компилятор ты обманешь, но себя нет. Смотри, ты просто напросто введёшь новое имя типа char, в котором цифра 15 абсолютно ничего не будет значить. Просто string[15] новое имя и всё тут.

Естественно, s.group[i] теперь будет иметь тип char* (или что то же самое string[15]*), поэтому и компильнётся. Но!

Во-первывх, я тебе предлагал то же самое, объявить переменную типа char* и с ней работать (предпоследний вариант)

А во-вторых (и это главное!) Тебе нужен массив из 15-ти СВОБОДНЫХ ячеек. Работая так, ты его не получишь. То есть эта штука
C++
1
s.group[i]
будет действительно содержать адрес элемента типа char, и можно даже так будет писать:
s.group[i][0] или s.group[1] и всё будет работать, но! Никто тебе не даст гарантии,
что ты не прописываешь память. ПО другому: По этим адресам:
&s.group[i][1] или &s.group[i][2] и так далее (но не &s.group[i][0]!)

могут запростто находиться нужные тебе данные, которые ты просто-напросто затрёшь.
Бессонная ночь с отладчиком обеспечена. А ты умеешь им пользоваться?

...Справедливости ради скажу, что такая ситуация довольно редка, как правило
компилятор если присваиевает указателю на char какое-нибудь значение, то почти всегда
ячеек сколько-то там за этоя ячепйкой пусты. То есть
&s.group[i][0] это "наша" ячейка, а &s.group[i][1] уже не наша, но она скорее всего не
задействована.Ну и прочие не задействованы, сколько их там, сто ли, двести ли.
Но как узнать наверное? Не рекомендую,в общем рисковать. Я один раз в
жизни напоролся на такую ошибку, больше не хочу.

...Кстати, потому я выше где-то не рекомедовал писать s.group[i].str[15]

Добавлено через 30 минут
...Так чё далеко ходить, вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int main () {
 
   
 char per_1= 'a';
 char per;
 char* ukaz= &per;
 printf ("per_1= %c\n", per_1);
 printf ("adres per= %x\n", &per);
 printf ("adres per_1= %x\n", &per_1);
 
 char stroka []= "stroka"; 
 
 strcpy(ukaz, stroka);
 
 printf ("per_1= %c\n", per_1);
 
 getchar ();
 
}
...Рекомендую изучить. Как раз иллюстрирует то, о чём я говорю. Дыва раза выводится значение переменной per_1 и оба раза разное, хотя мы её вообще не трогали. Просто-напросто скопированли строку по адресу переменной per.

И затёрли к матери per_1, как раз символ t прописали на её место (она стоит в аккурат после per, не зря там адреса выводятся.)
Yandex
Объявления
30.03.2010, 18:33     Массив символов в структуре
Ответ Создать тему
Опции темы

Текущее время: 00:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru