默认情况下,global/local 结构指针的解引用值是否始终设置为 0(或等效值)?
Are dereferenced values of a global/local struct pointer always set to 0 (or equivalent) by default?
我知道 global/static 变量在 C 中默认设置为 0 或等效值。
指向结构的指针怎么样?
例如,考虑下面的代码 -
typedef struct meh
{
int * ptr;
int a;
char c;
}var;
var *p;
int main(){
p = malloc(sizeof(var));
var *p1 = malloc(sizeof(var));
printf("%d\t%p\t%c", p->a, p->ptr, p->c);
printf("\n%d\t%p\t%c", p1->a, p1->ptr, p1->c);
return 1;
}
//Output for both cases : 0 (nil) '[=11=]'
无论指针的范围如何,结构指针的解除引用值是否始终设置为 0?或者这里有更具体的规则。
malloc
函数返回的内存未初始化。返回的指针是分配给局部变量还是全局变量都没有关系。
这意味着 pointed-to 个对象具有 不确定的值 ,读取它们可能会导致 undefined behavior。
如果您使用 calloc
函数分配内存,返回的内存所有字节都设置为 0。这意味着整数类型的值为 0。浮点类型也将为 0 if 使用 IEEE754 表示,指针值将是 NULL
if 空指针表示为所有字节 0。在大多数系统上你可能会遇到这种情况,但一般情况下并非如此。
我知道 global/static 变量在 C 中默认设置为 0 或等效值。
指向结构的指针怎么样?
例如,考虑下面的代码 -
typedef struct meh
{
int * ptr;
int a;
char c;
}var;
var *p;
int main(){
p = malloc(sizeof(var));
var *p1 = malloc(sizeof(var));
printf("%d\t%p\t%c", p->a, p->ptr, p->c);
printf("\n%d\t%p\t%c", p1->a, p1->ptr, p1->c);
return 1;
}
//Output for both cases : 0 (nil) '[=11=]'
无论指针的范围如何,结构指针的解除引用值是否始终设置为 0?或者这里有更具体的规则。
malloc
函数返回的内存未初始化。返回的指针是分配给局部变量还是全局变量都没有关系。
这意味着 pointed-to 个对象具有 不确定的值 ,读取它们可能会导致 undefined behavior。
如果您使用 calloc
函数分配内存,返回的内存所有字节都设置为 0。这意味着整数类型的值为 0。浮点类型也将为 0 if 使用 IEEE754 表示,指针值将是 NULL
if 空指针表示为所有字节 0。在大多数系统上你可能会遇到这种情况,但一般情况下并非如此。