我编写了这段代码,然后分配并释放一个结构的内存:
struct item {
int val;
int *vectOfInt;
struct item *next;
};
void relItem(struct item **currItem) {
struct item *temp;
int *intTemp;
temp = *currItem;
intTemp = (*currItem)->vectOfInt;
*currItem = (*currItem)->next;
free(temp);
free(intTemp);
}
int main() {
int array[] = {0, 1, 2, 3, 4, 5};
struct item *list = NULL;
list = (struct item*) malloc(sizeof(struct item));
list->val = 0;
list->vectOfInt = array;
list->next = NULL;
relItem(&list);
return 0;
}编辑:注释的代码:
struct item {
int val;
struct item *next;
};
void edit(struct item *currItem) {
currItem->val = 2;
}
int main() {
struct item *list = NULL;
list = (struct item*) malloc(sizeof(struct item));
list->val = 0;
list->next = NULL;
edit(list);
//list-val == 2
return 0;
}int a[5];在内存中,a是指向分配给a[5]数组的缓冲区的第一个位置的指针))。
结构初始化的 (struct item *s)的平等表示是什么?
发布于 2011-07-27 11:43:58
-You需要使用双指针,因为您需要将指针更改为您的结构,并且在C中不允许引用调用。
-It不能使用单个指针。因为要更改指向对象的指针。通过语句*currItem = (*currItem)->next;执行此操作,为了永久地更改它,需要使用指向它的指针。这样你就可以使用双指针了。
你可以这样想:
您有一个整数变量a,需要一个函数来更改它的值。只需使用指向变量a的指针调用此函数,如下所示:
void changeTheValue(int *x)
{
*x = 7;
}
void main()
{
int a = 5;
changeTheValue(&a);
}在这种情况下,您希望更改指针的值,只需将指针传递给函数。(双指针)就这样简单。如果您想用函数来更改某事物的值,那么您必须传递它指向函数的指针.。
-When你打电话给malloc,你想从它得到空间。你说你想要一个和你的结构一样大的空间。(就像在这里一样,list = (struct item*) malloc(sizeof(struct item));)和malloc分配一个和您的结构一样大的空间。如果您的结构的大小是1字节,那么您有一个1字节的空间,如果是4,那么您就有连续的4个字节。看,这就是如何将您的结构保存在内存中。如果您声明了一个struct变量或一个数组等等,那么您的结构就像一个数组(如果它是一个很好的比喻)一样保存在内存中。第一个成员第一个,然后第二个..。
如果你有一个结构
struct myStruct
{
int a;
float b;
char c;
};那么记忆就像
一个
B
C
ps:您正在对free(intTemp);行中的空闲进行非法调用,您正在使用一个没有*malloc*ed的变量。
发布于 2011-07-27 11:11:31
如何在不使用指向结构的双指针的情况下做同样的事情?
你必须使用双指针。
,你能解释一下为什么和如何工作(指针和双指针)吗?
双指针是必要的.数据结构是指向结构的指针。然后调用一个需要修改该指针的函数。由于参数是通过值传递的,所以必须将指针传递给指针。
我不明白如何在主存中表示结构.
通常结构是按顺序排列的。因此,第一个成员将放在为结构保留的内存的开头,第二个成员将跟随它,依此类推。还有填充和对齐的问题,但这有点复杂,最好留给编译器处理。
发布于 2011-07-27 11:10:34
list的值(并且想要更改),则必须给出它的地址,因为C中的所有参数都是通过值传递的,而不是通过引用传递的。。
当没有在堆上分配vertorOfInts时(使用malloc),但是在堆栈上(int array[] = {0, 1, 2, 3, 4, 5}; -本地分配),这是无效的,可能会使程序崩溃。
https://stackoverflow.com/questions/6843295
复制相似问题