我有一个很基本的问题,需要帮助我试图理解动态分配内存(堆上)的作用域是什么。

#include <stdio.h>
#include <malloc.h>

//-----Struct def-------
struct node {
        int x;
        int y;
};

//------GLOBAL DATA------

//-----FUNC DEFINITION----
void funct(){
  t->x = 5; //**can I access 't' allocated on heap in main over here ?**
  t->y = 6; //**can I access 't' allocated on heap in main over here ?**
  printf ("int x = %d\n", t->x);
  printf ("int y = %d\n", t->y);
  return;
}

//-----MAIN FUNCTION------
int main(void){
      struct node * t = NULL;// and what difference will it make if I define
                                 //it outside main() instead- as a global pointer variable
          t = (struct node *) malloc (sizeof(struct node));
      t->x = 7;
      t->y = 12;
      printf ("int x = %d\n", t->x);
      printf ("int y = %d\n", t->y);

    funct(); // FUNCTION CALLED**
    return 0;
}

在这里,我可以访问t中的结构funct()吗,即使内存是在main()中分配的,而不传递参数(指向tfunction funct的指针),因为堆是线程的公共对象如果我将struct node * t = NULL之外的main()定义为全局变量,会有什么不同?它有什么问题吗?

最佳答案

当您使用malloc()时,它返回的内存可以访问代码中的任何位置,前提是您可以看到包含malloc()返回的指针的变量。
所以在您的代码中,如果t是全局的,那么它在main和funct()中都是可见的,是的,您可以在两者中都使用它。
事实上,正如前面提到的,funct()不知道t是什么,因为t的声明和定义在main中;t在funct中超出了范围如果funct知道t是什么,那么你分配到t上的内存将在funct中可用。

关于c - 线程中的所有函数都可以访问动态分配的内存(堆),即使不传递指针还是它在函数本地?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/692636/

10-09 09:04