Я обучаю друга C. Мы работали со структурами и указателями, и я дал ему программу, чтобы он попробовал на своем компьютере. Мы собирались разобрать программу построчно, чтобы он мог понять, как структуры и указатели работают вместе. Со своей стороны я получаю такой результат:
Значение a в астре - 5
Значение b в ASTR равно 5.550000
Значение c в ASTR равно 77
Значение d в астрах равно 888.888800
На его компьютере программа в основном работала, за исключением последнего значения astr-> d, которое выводило очень большое отрицательное число. Итак, мой вопрос: почему это происходит на его компьютере, а на моем работает нормально? ниже приведен код нарушения:
#include <stdio.h>
#include <stdlib.h>
int main(){
struct a_struct{
int a;
float b;
int c;
double d;
};
struct a_struct* astr;
astr = (struct a_struct*)malloc(sizeof(astr));
astr->a = 5;
astr->b = 5.55;
astr->c = 77;
astr->d = 888.8888;
printf("Value of a in astr is %d\n", astr->a);
printf("Value of b in astr is %f\n", astr->b);
printf("Value of c in astr is %d\n", astr->c);
printf("Value of d in astr is %lf\n", astr->d);
return 0;
}
2 ответа
Это связано с тем, что программа неправильно распределяет память. Приведенный ниже оператор фактически назначает память, равную размеру указателя, который может быть 32-битным или 64-битным в зависимости от архитектуры ОС.
struct a_struct* astr;
astr = (struct a_struct*)malloc(sizeof(astr));
Вместо этого вам следует сделать:
struct a_struct* astr;
astr = (struct a_struct*)malloc(sizeof(struct a_struct));
Если вы распределяете память динамически, вы должны позаботиться о том, чтобы выделить память для объекта, чтобы хранить ваши данные, а не только указатель на первый член чего-то, что вы не выделили. «Другой способ» - это сначала явно объявить структуру как переменную, а затем указатель на ее адрес:
struct a_struct astrV;
struct a_struct *astr = &astrV;
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.