2012-06-30 2 views
6

Следующий код C возвращает ошибку «ошибка сегментации». Я не понимаю, почему он не возвращает значение 20. Какая у меня ошибка?Сегментация Неисправность при попытке печати значения в C

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; 

    printf("%i\n",*n); 

    return 0; 

} 
+0

'п' неинициализированная значение указателя, что вы разыменования в строке «* п = 20 ». Если вы хотите использовать указатель, вы должны убедиться, что вы его инициализируете, чтобы указать на допустимую ячейку памяти, прежде чем пытаться разыменовать ее. – reuben

+0

В качестве альтернативы уже предоставленным ответам вы можете просто «int n = 20» и передать '& n' (адрес n), какому бы функции не требовалось значение' int * 'в качестве параметра. – Vassilis

ответ

14

Вы не выделили память n, так

*n = 20; 

попыток записи энной памяти.

Попробуйте

#include <stdlib.h> 

int *n = malloc(sizeof *n); 
/* use n */ 
free(n); 
+1

Не забудьте бесплатно, когда вы закончите! –

+0

Хорошо, что. –

4

Вы не выделили место для вашего int, вы только объявили указатель к int.

Указатель неинициализирован, поэтому запись в это неизвестное пространство в памяти является неопределенным поведением и вызывает проблемы. Обычно это вызывает segfault.

можно выделить слот для целого числа, используя malloc:

n = malloc(sizeof(int)); 

и использовать соответствующий вызов free, чтобы освободить память позже:

free(n); 

Но выделение одного слота для целое довольно необычно, обычно вы должны выделить int в стеке:

int n; 
n = 20; 
1

Вы пытаетесь написать 20 стоимости мусора. Вы должны выделить для него пространство, используя одну из функций *alloc() или создав int на стеке и получив andress of it (как упомянул Ричард Дж. Росс III в комментариях).

динамическое распределение:

int n*; 
n = malloc(sizeof(int)); /* allocate space for an int */ 
if(n != NULL) { 
/* do something.. */ 
free(n); /* free 'n' */ 
} else { 
    /*No space available. */ 
} 

или на стека:

int int_on_stack; 
int *n = &int_on_stack; 
*n = 20; 
printf("%i\n", *n); // 20 
+1

Обратите внимание, что 'malloc' - не единственное решение. Существует 'mmap',' alloca' и просто создается int в стеке и получает его адрес. –

+0

@ RichardJ.RossIII: Спасибо. Обновлено. – Jack

+0

Ваш пример стека не согласуется с «получением и попыткой его». То, что вы хотите, это 'int onstack; int n = & onstack; * n = 20; printf ("% i \ n", * n); '... Эй, у меня есть права на изменение, поэтому я пошел дальше и внес изменения. –

Смежные вопросы