从函数

时间:2015-08-20 09:33:10

标签: c arrays pointers

在下面的程序中,我尝试将数组传递给函数,将其作为指针返回,并打印出值。

int* assign(int* ptr2){
  int temp[6];
  for (int i=0;i<6;i++)
    temp[i] = *ptr2++;
  ptr2 = temp;
  printf("addr:%p \n",ptr2);
  for (int i=0;i<6;i++)
    printf("%d ",*ptr2++);
  printf("\n");
  ptr2=temp;
  return ptr2;
}

int _tmain(int argc, _TCHAR* argv[])
{   
  int ele[] = {1,2,3,4,5,6};
  int *ptr;
  ptr = assign(ele);
  printf("addr:%p \n",ptr);
  for (int i=0;i<6;i++)
    printf("%d ",*ptr++);
  getchar();
  return 0; 
}

这是输出:

addr:0020F7D0
1 2 3 4 5 6
addr:0020F7D0
2160632 2 3 2160698 25558054 1277364467

&#34; assign&#34;中的值是正确的。功能但主要功能出错了。 这很奇怪因为ptr2和ptr都指向同一个地址,所以这里的问题是什么?

3 个答案:

答案 0 :(得分:2)

让我们来说明这里发生的事情:

main

ele: {1, 2, 3, 4, 5, 6}

assign

ptr2 => ele (passed argument)
tmp: {1, 2, 3, 4, 5, 6} (copied from ptr2 => ele)
ptr2 => tmp (local array)
<printing tmp>
return ptr2 => tmp
<tmp becomes invalid (assign ended)>

返回main

ptr => tmp (from assign, but invalid!)
<printing ptr: undefined behaviour>

现在ptr2指向tmpassign的本地变量。请记住,局部变量超出范围,并且当它们本地的块结束时变为无效。因此ptr中的main指向某些内存,当assign结束时,这些内存无效,并且最终会打印垃圾。

答案 1 :(得分:0)

在将其分配给temp后,您将返回本地变量ptr2的地址。当temp函数超出范围时,assign函数的末尾将清除var conditions = {_id: playerID, 'gameStats.GameID' : gameID}, update = {$inc: {'gameStats.$.wins' : 1}}, options = {new : true}; player.findAndModify(conditions, update, options, function (err, doc) { if (err) { console.log("updated failed") return res.sendStatus(300); } 的内存,因此不再有效。

答案 2 :(得分:0)

当你这样做时:

assign

在函数ptr2中,您刚刚在当前作用域中创建了一个局部变量,存储在堆栈中。因此,一旦该函数结束,您就超出了范围,并且该变量被移除了堆栈。

然后, function deleteVector() { var value = $('#hs').val(); console.log(value); $.ajax({ type: "GET", url: "/deleteGeoJson", data: {id: value}, contentType: 'application/x-www-form-urlencoded; charset=UTF-8', success: function (data) { var parser = new OpenLayers.Format.GeoJSON(); var feature = parser.read(data.data); } }); } 包含一个不再存在的变量的地址。