C中的悬空指针和空指针有什么区别?从技术上讲,两者似乎相同。


回答 1:

只要您不取消引用任何这些指针,就没有区别。因此,悬空意味着指针所指向的内存被允许重用于其他用途,但是程序假定旧内容仍然存在并尝试访问它。这通常会导致程序执行中某些时候出现错误行为。

除此之外,我觉得问题本身强烈表明您不“理解指针”。如果您将内存想象成一排带编号的框,其中每个框都可以包含内容(一个值,通常为0 ... 255),则指针只是一个整数(不包含整数)(我在这里简化体系结构细节)值)之一。


回答 2:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 3:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 4:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 5:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 6:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 7:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 8:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 9:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。


回答 10:

我在这里看到很多“英语”,这对于已经知道概念的人可能有用,但对于不知道这些概念的人,这些东西只会是乱码。但是,答案和隐喻中的有趣商号在滴答作响,如果侮辱任何人,则表示歉意。

空指针:一个指针,它不包含任何地址或说空位置。在此位置写是错误的。这样做的目的是为了防止程序员意外写入可能会导致分段错误和/或崩溃的内存位置。其想法是始终在初始化之前使用NULL初始化指针并检查NULL。考虑这种情况:

int * p; //现在,此指针包含一个随机地址,可以指向任何位置,甚至不在段中

* p = 10; //这肯定会造成错误。

安全的方法是这样的:

int * p = NULL;

如果(p!= NULL)

* p = 10;

悬空指针:顾名思义,因为最初指向的内存块以某种方式释放,所以对于指向何处毫无头绪。

有多种方法可以使指针悬垂。最常见的方法是新建,复制和删除

int * p = NULL; int * q = NULL;

p =新的x;

q = p;

删除q; //从内存中删除q和q的内存块指针

//从这里开始,我们有一个指针p,该指针的p地址在内存中不存在。如果我们尝试为该指针分配一些值,则很麻烦,这里的p是悬空指针

* p = 10; //崩溃

其他可能偶然创建悬空指针的方法是通过赋值或将对象传递给方法来进行对象的浅表复制,从而使用编译器提供的复制构造函数再次为您执行浅表复制。