如何检查分配的内存是否已初始化

时间:2011-11-29 20:26:25

标签: c pointers initialization dereference

我接触到指针int* i,其中我只知道它的内存被分配,但我不确定它是否已被初始化为某个整数。

如果我试图尊重它,会发生什么?换句话说,我应该如何检查它是否已初始化?如果不是,我想为该地址分配一个整数值;否则我什么都不做。

5 个答案:

答案 0 :(得分:5)

定义“已初始化”。总会有一些值,并且你无法判断该值是垃圾还是整数,因为任何32位垃圾都会产生一些价值。你可以取消引用它,没问题。

答案 1 :(得分:0)

  

我接触到指针int * i,其中我只知道它的内存   已分配但不确定它是否已初始化为某个整数或   不

如果我被指定为指针而未初始化,则会出现段违规。如果i被分配并初始化为某个整数X ...即

int X = SOMEVALUE;

    int* i;
    i = &X; // It would seem silly to malloc a single int...

然后它被初始化为IF并且仅在X被初始化时。如果您知道它指向的值的某些预期边界,那么建议在使用之前执行边界检查...

  

如果我试图尊重它,会发生什么?换句话说,怎么做   我应该检查它是否已初始化?如果不是,我想   为该地址分配一个整数值;否则我什么都不做。

我的典型做法是将指针初始化为0或NULL,直到我有一个实际值来提供它们。在调用somesort的* X * alloc函数之前...然后如果它在任何地方我会尝试使用它...我做了...

if (myPtr == NULL)
{
 printf("Run failure handling code...\r\n");
 return FUNC_FAILED_CONST;
}

但是我需要更多信息来了解你的情况......

答案 2 :(得分:0)

良好的编程习惯包括为未初始化的指针分配NULL。如果您正在处理来自其他地方的指针,通常会检查以确保它不是NULL。在你的情况下:

if (i != NULL)
  *i = the_int_you_assign;

但是,如果没有指定的方法来处理它并且你不能指望良好的编程习惯,那么你就无法真正为自己辩护。

答案 3 :(得分:0)

i通常是整数(通常为int)对象的名称。调用指针i令人困惑。

所以,让我们假设你有

int *p;

你说"它的记忆被分配了#34;。你的意思是指针对象本身的内存(在你声明p时分配),或者你指的是它所指向的int对象的内存?

在任何一种情况下,您都无法判断它是否已初始化。

如果p具有静态存储持续时间,则其初始值(在没有显式初始化器的情况下)是空指针;它并没有指向任何东西。否则,它的初始值是垃圾,除了为它分配一些有效值之外,你不能安全地用它做任何

另一方面,如果您的意思是p已初始化为指向某个int对象,但该对象可能已初始化,也可能未初始化,则您遇到类似问题。如果你有:

int *p;
p = malloc(sizeof *p);
if (p == NULL) {
    /* malloc() failed! */
    exit(EXIT_FAILURE);
}

然后p指向已分配的int对象,但该对象的值是垃圾。在大多数系统上,您可以安全地访问值(*p) - 但这样做没有意义。但int陷阱表示可能;如果是这样,只是访问*p的值有未定义的行为,并可能导致您的程序崩溃。优化编译器可以在存在未定义对象的情况下执行意外操作;它可以假设它已经被初始化为某个值,并且没有费心去实际获取存储的值。

未初始化的int对象没有特殊值,标记或标记。在程序员尝试访问它之前,确保任何对象都具有有效值完全取决于您。 (有些语言会为你追踪这些东西; C不是那些语言之一。当然,很多这些语言的实现都是用C语言编写的(非常仔细)。)

所以你问错了问题。如果您不知道对象是否已初始化,解决方案是找出(逻辑上,当您编写代码时,而不是在程序执行期间)它是否已初始化。最好的方法是确保 初始化。

如果您尝试执行以下伪代码:

 if (/* *p has been initialized */) {
     do something with *p;
 }
 else {
     do something else;
 }
那时你做错了。代替:

/* Ensure p points to a valid int object */
*p = some_value;
/* Now you *know* *p has been initialized */
do something with *p;

答案 4 :(得分:0)

你也可以重新定义malloc,使其分配内存块并使用这样的宏一次将其初始化为零字节:

#define malloc(p, size) do {if (p != NULL) {p=malloc(size); memset(p, 0, size);}} while(0);

或者如果您愿意,可以使用calloc

重新定义malloc
#define malloc(p, elCount , elSize) do {if (p != NULL) {p=calloc(elCount,elSize);}} while(0);

通过强制使用这样的构造,你将确保任何使用malloc()的程序员也正确地初始化内存,这样就没有指针显示垃圾数据。