这是Zed的Shaw的了解C对坚硬方式:声明一个结构栈
#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}
,我们在栈上声明地址,我们正在分配该结构来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'并写入它。它持续存在,因为'malloc'内存一直存在,直到'free'd。 – 2016-09-22 06:09:12
@Rhymoid当我声明一个函数内的变量(不调用malloc)时,它不保证被存储在堆栈中? http://stackoverflow.com/questions/10916799/how-to-create-a-struct-on-the-stack-in-c – user2635088