Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量混淆_C_Variables_Loops_Memory Management_Malloc - Fatal编程技术网

C 变量混淆

C 变量混淆,c,variables,loops,memory-management,malloc,C,Variables,Loops,Memory Management,Malloc,我必须阅读函数中的更多元素p。 在循环中每次创建pElem是否更好 dataStr * process(char *start, char *stop, GTree* tree) { while ( (cp != NULL) && ( cp < nextI)) { //I malloc inside of getPElem function pElem * p = getPElem(cp, dateP, s); free(p

我必须阅读函数中的更多元素p。 在循环中每次创建pElem是否更好

dataStr *  process(char *start, char *stop, GTree* tree)
{
  while ( (cp != NULL) && ( cp   < nextI))
  {
      //I malloc inside of getPElem function
      pElem * p = getPElem(cp, dateP, s);
      free(p);
  }
}
dataStr*进程(char*开始、char*停止、GTree*树)
{
而((cp!=NULL)和&(cp
或者我最好初始化一次p元素,然后每次都重用它

dataStr *  process(char *start, char *stop, GTree* tree)
{
  pElem * p = malloc(sizeof(p));
  while ( (cp != NULL) && ( cp   < nextI))
  {
      fillPElem(p, cp, dateP, s);

  }
  free(p);
}
dataStr*进程(char*开始、char*停止、GTree*树)
{
pElem*p=malloc(sizeof(p));
而((cp!=NULL)和&(cp
如果一个元素更好,我是否应该在函数外部对其进行malloc(函数“process”也在循环中调用):

dataStr*进程(char*start、char*stop、GTree*tree、pElem*p)
{
而((cp!=NULL)和&(cp

或者每次在函数中,如第二个示例中所示?

如果您不需要pElems超过封闭范围,则根本不需要动态分配:

dataStr *  process(char *start, char *stop, GTree* tree)
{
  pElem p;
  while ( (cp != NULL) && ( cp   < nextI))
  {
      fillPElem(&p, cp, dateP, s);

  }
}
dataStr*进程(char*开始、char*停止、GTree*树)
{
pElem p;
而((cp!=NULL)和&(cp

(是的,我知道cp、nextI等都没有定义——我只是从问题中复制出来的)。

你发布的前两个片段应该是等效的?对我来说,
malloc
在循环中并没有得到很好的优化。如果只将其用作缓冲区,则只应执行一个
malloc
。是的,所有代码段都应该是等效的。因此,在函数之外分配它并将其作为参数不是更好吗?如果没有关于打算如何使用它的提示,我无法回答这个问题。没有一个原始函数将元素暴露在函数之外。我根本不需要它暴露在函数之外。我问这个问题的唯一原因是,函数进程是在循环中调用的。所以我每次都会得到新的毛皮。我想,我也可以在外面初始化一次。我真的不知道什么是更好的,所以我问为什么。您的解决方案更“自然”。声明变量并不会初始化它,它只是在堆栈上保留一些空间。对不起,这就是我提到的。现在它一直在保留和释放。
dataStr *  process(char *start, char *stop, GTree* tree)
{
  pElem p;
  while ( (cp != NULL) && ( cp   < nextI))
  {
      fillPElem(&p, cp, dateP, s);

  }
}