#c #arrays #string #structure
#c #массивы #строка #структура
Вопрос:
У меня есть следующий код. Я получил сообщение об ошибке «сброс памяти из-за ошибки сегментации», когда я записываю АДРЕС массива.Person’ к любому значению. любой, пожалуйста, помогите мне решить проблему.
#include <stdio.h>
typedef struct
{
char Person[15];
} stName;
typedef struct
{
stName Name;
} stSociety;
stSociety* SOCIETY;
#define ADDRESS SOCIETY->Name
int main()
{
int i;
for (i=0; i<32; i )
{
ADDRESS.Person[i] = 0;
}
printf("ADDRESS.Person=%sn", ADDRESS.Person);
printf("Finished");
return 0;
}
Комментарии:
1. Куда
SOCIETY
указывает is? Вам нужно сделать так, чтобы он указывал на действительную память перед разыменованием.2.
Person
этоchar[15]
все же вы пишете от0
до31
? Кроме того, вы никогда не выделяетеSOCIETY
и не указываете на объект, который был выделен.3. Кстати:
#define ADDRESS SOCIETY->Name
это очень плохая идея, она только добавляет путаницы в ваш код. И все идентификаторы заглавных букв должны использоваться только для макросов, это по соглашению.4. Также расскажите нам, чего вы пытаетесь достичь, тогда мы сможем помочь вам в правильном направлении. Что должен печатать ваш код?
Ответ №1:
Вы только что объявили структуры, вам также нужно их создать, и, следовательно, ОБЩЕСТВО ни на что не указывает.Кроме того, вы перебираете 32 значения, тогда как в массиве символов всего 15.Я изменил код, надеюсь, вы получите представление здесь
#include <stdio.h>
typedef struct
{
char Person[15];
} stName;
typedef struct
{
stName Name;
} stSociety;
#define ADDRESS SOCIETY->Name
int main()
{
stSociety* SOCIETY,sample;
SOCIETY = amp;sample;
int i;
for (i=0; i<15; i )
{
ADDRESS.Person[i] = '0';
}
printf("ADDRESS.Person=%sn", ADDRESS.Person);
printf("Finished");
return 0;
}