理解struct的动态扩展

时间:2014-03-14 09:29:00

标签: c struct

我试图了解结构是如何工作的。

在下面的代码输出中,我看到即使在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);
}

2 个答案:

答案 0 :(得分:2)

  

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

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

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

...

还可以使用转化说明符"p"打印void - 指针的值以及"zu"的{​​{1}}:

size_t

答案 1 :(得分: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的值将4大于tmp_row的值(对于32位系统) )。

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