我试图了解结构是如何工作的。
在下面的代码输出中,我看到即使在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);
}
答案 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位系统) )。
正如你在评论中提到的,你希望崩溃。为此,您可以尝试访问这些内存地址的值,然后它可能会崩溃。祝你好运! : - )