Я полагаю, что начало вашей проблемы здесь:
struct customer
{
char *p_last_name[MAX_NAME_LENGTH + 1];
float amount_owed;
int priority;
};
с этим кодом вы создаете 21 указатели на символ.
То, что вы хотите, это указатель символав пространство, которое будет содержать MAX_NAME_LENGTH + 1
символов
Поэтому вы хотели бы что-то вроде:
struct customer
{
char last_name[MAX_NAME_LENGTH + 1];
float amount_owed;
int priority;
};
Я также изменил p_last_name на просто last_name, чтобы на глаз это читалось более логично, но вы можете называть это как хотите, но сказать, что p_last_name означает, что это указатель, который не нужен, и он плохо читается
При объявлении или определении переменных вы читаете справа налево, тогда это будет массив из-за []
, который 21 большой, называется last name
, и это массив типа данных char
.
Теперь с C дело в том, что массивы и указатели имеютчто-то общее, или часто может быть перепутано ... потому что они технически одно и то же.Любой определяемый вами массив, который, в свою очередь, выделяет пространство в памяти, является не более чем указателем на начало массива , вот и все!
, когда вы делаете что-то вроде last_name[7]
тогда 7
- это количество прыжков с начала массива, которое в вашем случае всегда известно как last_name
.Размер перехода зависит исключительно от типа данных массива, когда он был определен.В вашем случае это char
, что составляет 1 байт, поэтому скачок last_name[7]
будет на 7 байт дальше, чем last_name
указывает на
For example if the contents in memory where `last_name` points to is abcdefghijklmnopqrst
- , тогда
char last_name[MAX_NAME_LENGTH + 1];
будетопределить переменную с именем last_name, которая технически является символьным указателем на непрерывный фрагмент памяти, который составляет MAX_NAME_LENGTH + 1
байт из-за типа данных char , и это указатель на начало этого фрагмента памяти. *last_name
- это то же самое, что и last_name[0]
, которое задерживает указатель символа last_name , так что оно возвращает содержимое памяти, равное a
*(last_name+2)
совпадает с last_name[2]
, то есть c
Кроме того, в
int main()
{
struct customer *p_customer;
int customer_amount;
этот оператор struct customer *p_customer;
создает один указательназывается p_customer , это указатель, который будет указывать на некоторый кусок памяти (еще не произошел), который имеет тип данных struct customer
, который определен выше.Хорошо, чтобы там.Затем в
if ((p_customer = (struct customer *)malloc(sizeof(*p_customer) *
MAX_NAME_LENGTH)) == NULL)
, где вы используете malloc
, чтобы зарезервировать часть памяти для того, что вы делаете, вы действительно делаете sizeof( a pointer )
то, что выдолжно быть (struct customer *) malloc( sizeof( struct customer ))
в дополнение к правильному определению 21-байтового массива символов, называемого last_name
в struct customer
.
. Он должен логически считываться на английском , часто справаналево, если нет, то заподозрить проблему.Также при компиляции учитесь использовать -W
, он может быть вашим другом и предупреждать вас о подобных проблемах.
ваш исходный код, вероятно, не выделяет или резервирует достаточно большой кусок памяти для количества набираемых вами символов.в магазине в p_last_name
.