char *arg[10] ;
arg
- массив указателей на символы. Вам нужно назначить им ячейки памяти, используя malloc
, прежде чем принимать ввод -
scanf("%s",arg[1]); // arg[1] is not assigned to point to any memory location
// and is what causing the segmentation fault.
Так же -
arg[1] = malloc( stringLengthExpectedToEnter + 1 ) ; // +1 for termination character
Так же должно быть и с остальными элементами массива (или) просто измените char*arg[10]
на char arg[10]
и убедитесь, что вводите только 9 символов.
Я думаю, что вы путаете между указателем и нормальной переменной .
int *ptr;
ptr
- переменная, которая может содержать адрес целочисленной переменной. Память выделена для переменной ptr
для хранения целочисленного адреса. Вот и все. ptr
находится в неинициализированном состоянии и не указывает, где (или) может указывать на мусор. Разыменование поведения неинициализированного указателя не определено, и вам повезет, если он выдаст ошибка сегментации .
Теперь вам нужно присвоить ему правильную ячейку памяти, используя malloc
.
ptr = malloc( sizeof(int) ) ; // Allocates number of bytes required to hold an
// integer and returns it's address.
Итак, ptr
теперь указывает на область памяти, полученную из свободного хранилища, которая может содержать целое число. Такие полученные местоположения из свободного хранилища должны быть освобождены с помощью free
, иначе у вас есть классическая проблема утечка памяти . Рекомендуется инициализировать указатель на NULL при объявлении.
int *ptr = NULL ;
Надеюсь, это поможет!
scanf("%d", ptr) ; // Notice that & is not required before ptr. Because ptr
// content is address itself.
A нормальная переменная история совершенно другая. Когда объявлено -
int var ;
Памяти выделено var
для хранения целого числа. Таким образом, вы можете напрямую назначить ему целое число.