【发布时间】:2017-01-30 13:54:47
【问题描述】:
这是来自 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->rows[i]。在调用database_create()之前,我已经初始化了conn->db = malloc(sizeof(struct Database));
一旦函数退出,addr 会被清理,因为它在堆栈上。 addr 的值如何在 conn->db->rows[i] 中持续存在?分配是否创建了存储在addr 中的数据的副本并将其存储在conn->db->rows[i] 的堆位置上?
谢谢!
【问题讨论】:
-
它被复制(即“按值”)到
conn->db->rows[i]。 -
"我们在堆栈上声明 addr" 在 C 中不能保证这一点。"addr 的值如何保持" 您分配了一个
struct Database并写入它。它会持续存在,因为mallocated 内存会持续到freed。 -
@Rhymoid 当我在函数中声明一个变量(不调用 malloc)时,它不能保证存储在堆栈中吗? stackoverflow.com/questions/10916799/…
-
@user2635088:C 语言标准没有规定必须在哪些内存段中分配变量。它取决于平台(编译器/链接器)。然而,大多数(甚至所有)常见实现在堆栈上分配非静态局部变量,在数据部分分配全局和/或静态变量,在堆中分配运行时内存块,这是真的。
-
@barakmanos 当您谈论 c 的实现时,这是指编译器-ISA 组合吗?即对于我的机器,它将是 gcc 和 x86_64?