我有以下代码部分,它提供了明确的null dereferenced。
uint64_t *var1 = NULL;
char *var2 = NULL;
//Alias transfer
var1 = (uint64_t *) var2;
//Dereferencing Null Pointer
*var1 = 0;
如果我再次将* var1重新分配给NULL,可以解决这个问题吗?
答案 0 :(得分:2)
如果我再次将* var1重新分配为NULL
,是否可以修复此问题
在向其写入内容之前,应使指针指向某个有效的内存位置。在你的情况下,你没有这样做,所以你有一个分段错误(或崩溃)。 因此,在向内存位置写入任何内容之前,必须将内存分配给指针。
uint64_t *var1 = malloc(sizeof(uint64_t));
答案 1 :(得分:1)
你可能不明白指针声明中的*
和指针算术表达式中的*
意味着相反的事情。
uint64_t *var1 = NULL;
这声明了uint64_t
指针(类型uint64_t*
)
*var1 = 0;
此取消引用指针,即访问存储在其地址的内存。它不给指针一个新值。它修改了指向的数据。在这种情况下,没有指向数据。 NULL
无法指向数据。因此错误。
如果您想更改指针的值,只需执行
var1 = 0;
如果我误解了你问题的意图,我很抱歉。在这种情况下,如果你想改变指向数据的值,那么首先让指针指向一些可写内存!
uint64_t var = 100;
/* ... */
var1 = &var; /* Get a pointer to the memory that is the variable var */
或
uint64_t *var1 = malloc(sizeof(uint64_t)); /* Allocate memory for one uint64_t on the heap and set var1 to point at it */
答案 2 :(得分:1)
uint64_t *var1 = NULL;
char *var2 = NULL;
您已经定义了分别为uint64_t和char类型的指针var1和var2,它们指向NULL。 并在此步骤
var1 = (uint64_t *) var2;
你试图使你的var1指向与var2相同的位置并将其从上面的两个部分转换为uint64_t.So。var1和var2指向NULL指针,即简单来说就没有了。
*var1 = 0;
在此行中,您尝试将值0分配给var1指向的位置,即NUll位置,即无效地址,并且取消引用无效/空地址将导致崩溃。
在分配值之前,您需要分配一个内存并使指针指向该内存位置,然后分配一个值。
var1 = malloc(sizeof(uint64_t));
*var1 = 0;
这应该可以使您的代码正常工作。