2013-07-16 42 views
0

声明简单的结构:困惑与访问内存的malloc(未初始化)

struct s { 
    char* addr; 
}; 

s *ips; 

现在在分配这些结构阵列存储

num = 5 
ips = (r *) malloc(num * sizeof(r)); 

我知道刚才的malloc分配内存,并没有初始化,有可能是垃圾值。

现在我想知道如果我不初始化一个,并尝试访问会发生什么?

//Init for 4 of them 
for(int i = 0; i < num-1; i++) 
    ips[i].addr = strdup("123"); 

//Accessing un-initialize one: 
if(ips[4].addr) { 
    printf("Accessing uninitialize one and lets say freeing!!!"); 
    free(ips[4].addr); 
} 

理想不应该进入这个循环。但是,我认为,因为它可能是垃圾值。我不确定!

+6

恭喜!你问了第1,000,000个“当我调用未定义的行为时会发生什么?”题!您的免费C标准副本在邮件中。 –

+0

[未定义,未指定和实现定义的行为]的可能的重复(http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior) –

+3

只要你编写不编译的代码你应该安全。 –

回答

1

会发生什么将是不可预知的,因为你不知道内存包含什么。您应该使用calloc而不是mallocmemset调用malloc后的内存。

我个人更喜欢使用calloc,因为它保存了一行代码,并且稍后可以更轻松地阅读代码。

+0

'calloc'和'memset'都不能保证将指针设置为null或浮点对象为'0.0' 。 –

+0

@Keith Thompson你认为'calloc()'不能保证为NULL或0.0,这是因为尽管内存是零填充的,NULL和0.0 _may_不只是由零位组成?或者还有别的吗? – chux

+0

@chux:就是这样。在最常见的实现中,空指针和浮点“0.0”都被表示为全零位,但C标准并不能保证它。如果你打算编写依赖于这个假设的代码,我建议至少做出明确的假设。 (我宁愿不依赖它;例如,'const foo_t foo_zero = {0};'给你一个类型为'foo_t'的对象,所有成员都设置为零(整数0,浮点数0.0,空指针,... ) –

0

初始化您的变量。

没有初始化 - 所有投注都关闭。
ips[4].addr,就像你知道一样,是未初始化的。所以使用:

// Various code 
... 
if(ips[4].addr) { 

是一种复杂的简单方法,询问以下内容:

int i; 
if (i) { 

每次运行该程序时,i的值可能相同。如果可能会不同。没有理想的事情发生。这是简单的未定义行为(UB)。