如何在启动时将c或c++程序中的所有内存初始化为NaN(Not-A-Number),以便使用gdb进行调试?我相信默认情况下gdb会使用零来替换,但这通常对查找由于初始化错误而崩溃的代码没有帮助。附言:我想把每个变量和数组初始化为NAN(或者一些垃圾),只是为了调试。我正在使用的程序有数千个变量,所以改变每个变量相当繁琐。
smtd7mpg1#
这些十六进制数字在Rafael的帖子中可能是正确的,但我会推荐一种更语义化的方法。参见http://en.cppreference.com/w/cpp/types/numeric_limits/quiet_NaN
#include <limits> double nan1 = std::numeric_limits<double>::quiet_NaN(); double nan2 = std::numeric_limits<double>::signaling_NaN();
注意,有两种NaN。
yftpprvb2#
您可以将浮点数转换为32位整数,并将其设置为
0x7FC00000 and 0x7FFFFFFF or 0xFFC00000 and 0xFFFFFFFF
对于转换为u64的双精度数,并将其设置为
0x7FF8000000000000 and 0x7FFFFFFFFFFFFFFF or 0xFFF8000000000000 and 0xFFFFFFFFFFFFFFFF
mbjcgjjk3#
你说的“初始化所有内存”是什么意思?这可能只在一些裸金属嵌入式系统上可行,而在Linux中是不可能的。每个程序都有两个相关的特殊内存区域:一个是零初始化,当然需要用零填充。这些变量被分配在标记为零的区域内,它们的值不存储在可执行文件中。另一个是初始化为某个显式定义的值。这些值存储在可执行文件中。虽然应该可以获得这个区域的边界(就像C库代码一样),但问题是,为什么要用NaN填充零初始化区域。这会在代码的其他地方产生不必要的副作用。例如,如果您有一个初始化为0的全局int,用NaN填充这个区域也会将该整数的初始值更改为完全意外的值。如果你需要一些变量或数组初始化为NaN,只需在声明它们时适当地初始化变量(如Notinlist和Rafael所解释的那样)。
#define NaNdouble(X) double X = std::numeric_limits<double>::quiet_NaN();
rkkpypqq4#
我方便地使用memset,值为-1。它适用于任何浮点类型。
#include <string.h> float x[5]; memset(x, -1, sizeof(x));
在之前发布的答案中,这种方法没有被明确提及。
4条答案
按热度按时间smtd7mpg1#
这些十六进制数字在Rafael的帖子中可能是正确的,但我会推荐一种更语义化的方法。
参见http://en.cppreference.com/w/cpp/types/numeric_limits/quiet_NaN
注意,有两种NaN。
yftpprvb2#
您可以将浮点数转换为32位整数,并将其设置为
对于转换为u64的双精度数,并将其设置为
mbjcgjjk3#
你说的“初始化所有内存”是什么意思?这可能只在一些裸金属嵌入式系统上可行,而在Linux中是不可能的。
每个程序都有两个相关的特殊内存区域:一个是零初始化,当然需要用零填充。这些变量被分配在标记为零的区域内,它们的值不存储在可执行文件中。另一个是初始化为某个显式定义的值。这些值存储在可执行文件中。
虽然应该可以获得这个区域的边界(就像C库代码一样),但问题是,为什么要用NaN填充零初始化区域。这会在代码的其他地方产生不必要的副作用。例如,如果您有一个初始化为0的全局int,用NaN填充这个区域也会将该整数的初始值更改为完全意外的值。
如果你需要一些变量或数组初始化为NaN,只需在声明它们时适当地初始化变量(如Notinlist和Rafael所解释的那样)。
rkkpypqq4#
我方便地使用memset,值为-1。它适用于任何浮点类型。
在之前发布的答案中,这种方法没有被明确提及。