我接触到指针int* i
,其中我只知道它的内存被分配,但我不确定它是否已被初始化为某个整数。
如果我试图尊重它,会发生什么?换句话说,我应该如何检查它是否已初始化?如果不是,我想为该地址分配一个整数值;否则我什么都不做。
答案 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
:
#define malloc(p, elCount , elSize) do {if (p != NULL) {p=calloc(elCount,elSize);}} while(0);
通过强制使用这样的构造,你将确保任何使用malloc()的程序员也正确地初始化内存,这样就没有指针显示垃圾数据。