作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这来自 Zed Shaw 的《Learn C the Hard Way》:
#define MAX_DATA 15
#define MAX_ROWS 100
struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};
struct Database {
struct Address rows[MAX_ROWS];
};
struct Connection {
FILE *file;
struct Database *db;
};
void Database_create(struct Connection *conn)
{
int i = 0;
for (i = 0; i < MAX_ROWS; i++) {
struct Address addr = {.id = i, .set = 0};
conn->db->rows[i] = addr;
}
}
对于 struct Address addr = {.id = i, .set = 0} 行,我们在堆栈上声明 addr,并将该结构分配给 conn ->db->行[i]
。在调用database_create()之前,我已经初始化了conn->db = malloc(sizeof(struct Database));
一旦函数退出,addr 就会被清除,因为它位于堆栈上。 addr
的值如何保留在 conn->db->rows[i]
中?分配是否创建存储在 addr
中的数据的副本并将其存储在 conn->db->rows[i]
的堆位置?
谢谢!
最佳答案
是的,这是一份副本作业。
在本例中,您有一个结构体数组,其大小等于MAX_ROWS*sizeof(struct Address)
。所以,无论如何,里面都有足够的空间。
考虑以下因素:
struct coord{int x,y;};
struct coord a = {0,0};
struct coord b;
b = a; //This is a copy assignment
这里,数组的每一行都包含一个完整的结构,您可以将 addr
的值复制到里面。
指针数组不是复制赋值:
struct Database {
struct Address *rows[MAX_ROWS];
};
之后,conn->db->rows[i] = &addr;
显然,在这种情况下您会遇到问题,因为指针引用的值未定义,并且不同的行很可能包含相同的地址。但如果您使用动态分配,那就没问题了。
如果您愿意,您可以尝试在两种情况下显示 sizeof(*(conn->db))
或 sizeof(conn->db->rows)
看看在不使用指针时数组确实保存 MAX_ROWS
结构的事实。
关于c - 在堆栈上声明一个结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39631388/
我是一名优秀的程序员,十分优秀!