在下面的程序中,我尝试将数组传递给函数,将其作为指针返回,并打印出值。
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都指向同一个地址,所以这里的问题是什么?
答案 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
指向tmp
,assign
的本地变量。请记住,局部变量超出范围,并且当它们本地的块结束时变为无效。因此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);
}
});
}
包含一个不再存在的变量的地址。