尝试在printf函数中使用指针时,程序不断崩溃

时间:2019-03-23 15:53:07

标签: c

我是编程新手。我正在尝试运行此极其简单的程序,以将指针集成到我的代码中。当我运行程序时,它在启动时崩溃,并弹出一个Windows has encountered an unexpected error。绝对不会为代码本身给出错误,但弹出窗口仍然存在。

到目前为止,我正在Code :: Blocks上运行代码,并且该程序在启动时随Windows弹出了所述弹出窗口。我还在codepad.org上测试了该程序,出现的唯一错误消息与第一行(包含语句)有关。错误状态: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 个答案:

答案 0 :(得分:3)

这里

number_pointer = random_number;

number_pointer是指针类型,应使用一些有效地址而不是一些值进行初始化。实际上,以上语句会导致编译器警告您

  

警告:分配给的指针转换不兼容的整数   'unsigned short *'中的'unsigned short *';用&作为地址   [-Wint-conversion]

但是您似乎忽略了这一点。永远不要忽略编译器警告。始终使用最少的警告标志(例如-Wall)编译代码,并阅读这些警告。例如

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

number_pointer必须指向random_number地址,以便像*number_pointer一样取消引用。

应该是

number_pointer = &random_number; /* assign the address of random_number */

答案 1 :(得分:0)

评论

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

似乎正确,但注释的代码不正确:

number_pointer = random_number;

random_number是一个数字,number_pointer是一个指针。
数字和指针是不同的类型,编译器应警告您它们是不兼容的类型。

为不兼容类型的变量分配值会导致数据丢失(当变量的类型使用的字节数少于值的类型时)。但是,分配不兼容类型的数据时的主要危险是数据损坏。

在您的情况下,number_pointer15,它是一个数字)的值存储在变量random_pointer中。使用random_pointer的值时,15被解释为指针,即内存中的地址,这是完全错误的。

然后,表达式*number_pointer尝试读取该地址处的内存,这将导致访问错误,该错误会受到操作系统(终止程序)的惩罚。

问题的根源是上述分配中&前面缺少random_number(运算符的“地址”)。它应显示为:

number_pointer = &random_number;

这意味着变量number_pointer(类型为“指向int的指针”)将存储变量random_number(类型为“ int”)的地址。它们是兼​​容的,程序的逻辑是正确的。然后,使用解引用运算符(*)成功读取存储在number_ponter变量中存储的地址处的整数值。