Первая часть проста:
@property
def x(self): ...
совпадает с
def x(self): ...
x = property(x)
property
с помощью только геттера. Следующим шагом будет расширение этого свойства с помощью setter и deleter. И это происходит с помощью соответствующих методов:
@x.setter
def x(self, value): ...
возвращает новое свойство, которое наследует все, начиная с старого x
и заданного установщика.
x.deleter
работает одинаково .
Переменная a
не инициализируется, чтобы указывать на действительный адрес памяти.
Поэтому, скорее всего, это указывает на неверный адрес памяти.
Вот один из способов исправить:
int *a = malloc(sizeof(int));
...
free(a); // when done using it
Вот еще один способ исправить:
int b;
int *a = &b;
Но я предлагаю вам выполнить следующие шаги, чтобы сделать его более простым и чистым. .
Измените это:
int *a;
К этому:
int a;
И это:
fscanf(input,"%d\n",a);
К этому:
fscanf(input,"%d\n",&a);
Когда вы пишете:
int *a;
, тогда a
является указателем , но в настоящее время он не указывает нигде.
Перед отправкой на fscanf
вы должны указать правильное хранилище для int
.
Например, внутри main()
:
int b;
a = &b;
fscanf(input,"%d\n",a);
Кроме того, ваш цикл неверен. Почти всегда ошибка использования feof
(не говоря уже о качестве условия цикла). Вместо этого вы должны проверить фактическую операцию чтения. В вашем случае:
while ( 1 == fscanf(input,"%d\n",a) )
{
printf("%d\n", a);
}
int *a;
, инициализируется нулевым указателем, если это переменная static , например переменная, определенная в глобальной области действия модуля (то есть вне любой функции). Однако в обсуждаемом здесь случае переменная объявляется внутри функции main()
, поэтому она является автоматической переменной и ее не нужно инициализировать. Следовательно, он указывает в любом случае, скорее всего, в какую-то несуществующую или, по крайней мере, недоступную область памяти, таким образом, чтение в указанную область вызывает исключение сегментации.
– CiaPan
17 May 2014 в 11:23
int *a;
был до main()
.
– M.M
17 May 2014 в 11:33