2014-03-14 54 views
0

我想了解结构如何工作。了解结构的动态扩展

在下面的代码输出中,我发现在calloc和realloc之前,值正确地分配了。

有人可以解释这是怎么回事,如何检查我的结构是否正确创建。

非常感谢您的时间和帮助!

typedef struct db 
{ 
    int x; 
}; 
int main() 
{ 
    int n = 1, i; 
    char yn = 'y'; 
    db *tmp_row, *row; 
    for (n = 0; n < 10; n++) 
     printf("tmp_row address, size,value - %u, %d, %d\n", &tmp_row + n, 
       sizeof(tmp_row), tmp_row + n); 
    tmp_row = (db *)calloc(1, sizeof(db)); 
    printf("\n\n"); 
    for (n = 0; n < 10; n++) 
     printf("tmp_row address, size,value - %u, %d, %d\n", &tmp_row + n, 
       sizeof(tmp_row), tmp_row + n); 
    tmp_row = (db *)realloc(tmp_row, n * sizeof(db)); 
    printf("\n\n"); 
    for (n = 0; n < 10; n++) 
     printf("tmp_row address, size,value - %u, %d, %d\n", &tmp_row + n, 
       sizeof(tmp_row), tmp_row + n); 
} 
+1

你是什么意思 “的价值观越来越正确分配” 是什么意思?你能否澄清你看到的输出结果,以及你期望看到的结果? –

+0

假设你没有在代码中放入正确的内容,你的'typedef'仍然缺少该结构别名的名称。 – user2485710

+0

嗨,地址和价值正在上涨的预期金额。地址是由8字节(我的操作系统是64位)和价值,我相信是int x的地址正在增加4. – csaw

回答

2

我该如何错误检查我的结构是否正确创建。

检查malloc/calloc/realloc是否返回NULL。在后一种情况下,调用失败并且没有分配内存。

tmp_row = calloc(1, sizeof(db)); 
if (NULL == tmp_row) 
{ 
    perror("calloc() failed"); 
    return -1; 
} 

... 

还可以使用在转换说明"p"打印和"zu"void -pointers值size_t

printf("tmp_row address, size, value - %p, %zu, %p\n", 
    (void*) (&tmp_row + n), 
    sizeof(tmp_row), 
    (void*) (tmp_row + n) 
); 
+0

感谢大家,我现在有了更好的理解。 @alk,%zu,正在返回zu ...不知道%p,谢谢。 – csaw

0

您的程序没有任何错误。

在此声明:

printf("tmp_row address, size,value - %u, %d, %d\n", &tmp_row + n, 
      sizeof(tmp_row), tmp_row + n); 

您正在访问的tmp_row地址和tmp_row价值,因为tmp_row未初始化将被存储一些随机值。请注意,如果你试图打印*(tmp_row + n);,那将是无效的存储器访问,在一些随机地址处的值。

访问垃圾值既不是错误也不是未定义的行为。

你定义int a;,然后尝试访问的a地址,或打印的a值,或打印的a + 10值。这是一样的。这是全部有效的,但是你不会得到任何确定性的输出。

此外,您的代码没有任何未定义的行为,因为您不访问这些内存位置的值,您只是在打印这些地址。

,因此很明显,如果tmp_row是一个指针那么tmp_row + 1的值将比的tmp_row4更大(用于32位系统)。

正如您在评论中提到的那样,您希望发生崩溃。为此,您可以尝试访问这些内存地址的值,然后可能会崩溃。祝你好运! :-)

+0

什么是动态分配结构的正确方法? – csaw

+0

如果您知道所需的内存量,请使用'malloc'或'calloc',否则使用'malloc'分配一些内存,然后使用'realloc'来扩展/缩短内存缓冲区。 –