首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双指针结构及其内存构成

双指针结构及其内存构成
EN

Stack Overflow用户
提问于 2011-07-27 11:05:26
回答 5查看 2.1K关注 0票数 2

我编写了这段代码,然后分配并释放一个结构的内存:

代码语言:javascript
复制
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;
}

编辑:注释的代码:

代码语言:javascript
复制
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;
}

  • How可以在不使用指向struct?
  • Can的双指针的情况下做同样的事情,您可以解释为什么和如何工作(指针和double-pointer)?
  • I都不理解结构是如何在主内存中表示的(例如,int a[5];在内存中,a是指向分配给a[5]数组的缓冲区的第一个位置的指针)

)。

结构初始化的 (struct item *s)的平等表示是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-27 11:43:58

-You需要使用双指针,因为您需要将指针更改为您的结构,并且在C中不允许引用调用。

-It不能使用单个指针。因为要更改指向对象的指针。通过语句*currItem = (*currItem)->next;执行此操作,为了永久地更改它,需要使用指向它的指针。这样你就可以使用双指针了。

你可以这样想:

您有一个整数变量a,需要一个函数来更改它的值。只需使用指向变量a的指针调用此函数,如下所示:

代码语言:javascript
复制
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变量或一个数组等等,那么您的结构就像一个数组(如果它是一个很好的比喻)一样保存在内存中。第一个成员第一个,然后第二个..。

如果你有一个结构

代码语言:javascript
复制
struct myStruct
{
    int a;
    float b;
    char c;
};

那么记忆就像

一个

B

C

ps:您正在对free(intTemp);行中的空闲进行非法调用,您正在使用一个没有*malloc*ed的变量。

票数 2
EN

Stack Overflow用户

发布于 2011-07-27 11:11:31

如何在不使用指向结构的双指针的情况下做同样的事情?

你必须使用双指针。

,你能解释一下为什么和如何工作(指针和双指针)吗?

双指针是必要的.数据结构是指向结构的指针。然后调用一个需要修改该指针的函数。由于参数是通过值传递的,所以必须将指针传递给指针。

我不明白如何在主存中表示结构.

通常结构是按顺序排列的。因此,第一个成员将放在为结构保留的内存的开头,第二个成员将跟随它,依此类推。还有填充和对齐的问题,但这有点复杂,最好留给编译器处理。

票数 2
EN

Stack Overflow用户

发布于 2011-07-27 11:10:34

  1. 如果要在不同的函数中更改list的值(并且想要更改),则必须给出它的地址,因为C中的所有参数都是通过值传递的,而不是通过引用传递的。
  2. 将地址给指针,因为您想要更改指针。
  3. int a5不是一个结构,而是一个数组、结构和数组,用C表示为内存块。当引用结构的成员时,实际上引用了结构位置的偏移量.

当没有在堆上分配vertorOfInts时(使用malloc),但是在堆栈上(int array[] = {0, 1, 2, 3, 4, 5}; -本地分配),这是无效的,可能会使程序崩溃。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6843295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档