当元素大小大于实际值大小时,为什么`g_array_append_val`会出现段错误?

时间:2017-05-30 07:08:01

标签: c memory glib

我的程序在代码中分段显示如下:

user_t user;
users = g_array_sized_new(FALSE, TRUE, sizeof(*user), nb_results);
g_array_append_val(users, user);

在第3行,我不是按值添加用户,而是通过指针添加它。这将有时段错。正确的做法是将GArray初始化为主机指针:

users = g_array_sized_new(FALSE, TRUE, sizeof(user_t *), nb_results);
g_array_append_val(users, user);

我不明白为什么此代码的第一个版本会出现段错误,因为sizeof(*user)大于sizeof(user_t *)

1 个答案:

答案 0 :(得分:1)

为简单起见,我们假设sizeof *user是六个字节,指针是四个字节。这意味着两个用户的数组有12个字节,足够三个指针的空间。 但是 当你从该数组中获取一个元素时,它将得到一个六字节的元素,它将包含一个半指针。

当您尝试将此值存储到指针中时,您将获得第一个指针的一半和另一个指针的一半。这将无效,当您取消引用它时,您将获得未定义的行为