Программа продолжает падать, когда практикуется использование указателя в функции printf - PullRequest
0 голосов
/ 23 марта 2019

Я новичок в программировании.Я пытаюсь запустить эту чрезвычайно простую программу на практике, чтобы интегрировать указатели в мой код.Когда я запускаю программу, она запускается при запуске с всплывающим Windows has encountered an unexpected error.Абсолютно никаких ошибок для самого кода не выдается, но всплывающее окно сохраняется.

На данный момент я запускаю код на Code :: Blocks, и программа выдает указанное всплывающее окно из Windowsна старте.Я также протестировал программу на codepad.org, и единственное сообщение об ошибке связано с первой строкой (оператор include).Состояние ошибки: Segmentation fault.

#include <stdio.h>
int main() {
    // Setting a variable to store the value 15.
    unsigned short int random_number = 15;
    // Defining my pointer.
    unsigned short int *number_pointer;
    // Setting the pointer to hold the memory address of my first variable.
    number_pointer = random_number;
    // Attempting to print the value at the memory address stored in the pointer.
    printf("This code will now print a number: %i", *number_pointer);
    return 0;
}

Я ожидаю, что вывод будет: This code will now print a number: 15., однако я даже не получил вывод из-за сбоя программы.

Ответы [ 2 ]

3 голосов
/ 23 марта 2019

Здесь

number_pointer = random_number;

number_pointer относится к типу указателя, и его следует инициализировать с некоторым действительным адресом , а не с некоторым значением.Фактически, приведенное выше утверждение заставляет компилятор предупреждать вас как

предупреждение: несовместимое преобразование целого числа в указатель, присваивающее «unsigned short *» из «unsigned short»;возьмите адрес с & [-Wint-преобразованием]

, но вы, кажется, проигнорировали это.Никогда не игнорируйте предупреждения компилятора.Всегда компилируйте код с минимальными флагами предупреждений, такими как -Wall, и читайте эти предупреждения.например,

gcc -Wall -Wextra -Wpedantic -Werror test.c  

* number_pointer должен указывать на адрес из random_number, чтобы вы могли отменить ссылку на него как *number_pointer.

Должно быть

number_pointer = &random_number; /* assign the address of random_number */
0 голосов
/ 23 марта 2019

Комментарий

// Setting the pointer to hold the memory address of my first variable.

кажется правильным, но прокомментированный код не является:

number_pointer = random_number;

random_number - это число, number_pointer - это указатель.
Числои указатель - это разные типы, и компилятор должен предупредить вас, что это несовместимые типы.

Присвоение значения переменной несовместимого типа приводит к потере данных (когда тип переменной использует меньше байтов, чем тип значения),Но главная опасность при назначении данных несовместимых типов - это искажение данных.

В вашем случае значение number_pointer (15, которое является числом) сохраняется в переменной random_pointer.Когда используется значение random_pointer, 15 интерпретируется как указатель, то есть адрес в памяти, и это совершенно неверно.

Выражение *number_pointer затем пытается прочитать память по этому адресуи это приводит к ошибке доступа, которая наказывается ОС (которая завершает вашу программу).

Источником проблемы является отсутствие & (оператор "address of") перед random_number в задании выше.Он должен читать:

number_pointer = &random_number;

Это означает, что переменная number_pointer (типа «указатель на int») будет хранить адрес переменной random_number (типа «int»).Они совместимы и логика программы правильная.Использование оператора разыменования (*) затем успешно считывает целочисленное значение, хранящееся по адресу, указанному в переменной number_ponter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...