我是编程新手。我正在尝试运行此极其简单的程序,以将指针集成到我的代码中。当我运行程序时,它在启动时崩溃,并弹出一个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.
,但是由于程序崩溃,我什至没有得到输出。
答案 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_pointer
(15
,它是一个数字)的值存储在变量random_pointer
中。使用random_pointer
的值时,15
被解释为指针,即内存中的地址,这是完全错误的。
然后,表达式*number_pointer
尝试读取该地址处的内存,这将导致访问错误,该错误会受到操作系统(终止程序)的惩罚。
问题的根源是上述分配中&
前面缺少random_number
(运算符的“地址”)。它应显示为:
number_pointer = &random_number;
这意味着变量number_pointer
(类型为“指向int的指针”)将存储变量random_number
(类型为“ int”)的地址。它们是兼容的,程序的逻辑是正确的。然后,使用解引用运算符(*
)成功读取存储在number_ponter
变量中存储的地址处的整数值。