首页 \ 问答 \ C将指针传递给堆栈上的数组(C passing a pointer to an array on the stack)

C将指针传递给堆栈上的数组(C passing a pointer to an array on the stack)

我很困惑它是否有效(在C中)将指针传递给已经如下启动的数组(例如在堆栈上的编译时):

int a[] = {1, 2, 3};

my_func(&a);


void my_func(int **a)
{
   int *tmp = *a; /* this statement fixes the problem */
   printf("%d %d %d", (*a)[0], (*a)[1], (*a)[2]); /*doesn't work */ 
   printf("%d %d %d", tmp[0], tmp[1], tmp[2]); /*does work */ 
}

当我使用gdb逐步执行此操作时,我无法从'inside'my_func中“看到”任何值(* a)[0]等。 例如

(gdb) p (*a)[0]
Cannot access memory at address 0x0

我想我可能对堆栈而不是堆上的数组能做什么和不能做什么有根本的误解?

我希望不是这种情况,因为我的单元测试非常方便在示例中声明堆栈上的数组,但我需要测试期望指向int指针的函数。

注意我收到编译器警告如下:

 test_utility.c:499:5: warning: passing argument 1 of ‘int_array_unique’ from incompatible pointer type [enabled by default]
 ../src/glamdring2.h:152:5: note: expected ‘int **’ but argument is of type ‘int (*)[12]’

但我认为将*a[]**a吗? 也许不是? 它们不相同吗?


I am getting confused as to whether it is valid (in C) to pass a pointer to an array that has been initiated as follows (e.g. at compile time on the stack):

int a[] = {1, 2, 3};

my_func(&a);


void my_func(int **a)
{
   int *tmp = *a; /* this statement fixes the problem */
   printf("%d %d %d", (*a)[0], (*a)[1], (*a)[2]); /*doesn't work */ 
   printf("%d %d %d", tmp[0], tmp[1], tmp[2]); /*does work */ 
}

when I step through this with gdb I can't 'see' any of the values (*a)[0], etc. from 'inside' my_func. e.g.

(gdb) p (*a)[0]
Cannot access memory at address 0x0

I'm thinking that possibly I have a fundamental misunderstanding with regard to what you can and can't do with arrays that are on the stack rather than the heap?

I hope thats not the case as it is very convenient for my unit tests to declare arrays on the stack as in the example, but I need to test functions that are expecting pointers to pointers to int.

Note I do get a compiler warning as follows:

 test_utility.c:499:5: warning: passing argument 1 of ‘int_array_unique’ from incompatible pointer type [enabled by default]
 ../src/glamdring2.h:152:5: note: expected ‘int **’ but argument is of type ‘int (*)[12]’

but I thought it would be ok to mix int *a[] with **a? Perhaps not? Are they not equivalent?


原文:https://stackoverflow.com/questions/8475407
更新时间:2019-11-21 10:09

最满意答案

a []是一个数组,而不是指针(“不是左值”); 在你的函数调用中

func( &a);

&衰减指向int的指针; &a 不是指向int的指针。 为什么? 没有指向指向的指针

功能原型

void func( int **p);

期望一个指向int的指针,这个指针不适合用int作为参数的指针调用的函数,就像你做的那样。

更新:我不知道OP的意图是什么,所以这只是猜测......

void my_func(int *a);

int a[] = {1, 2, 3};

my_func(a); /* note: this is equivalent to my_func( &a ); */


void my_func(int *a)
{
   printf("%d %d %d\n", a[0], a[1], a[2] ); 
}

a[] is an array, not a pointer ("not an lvalue"); in your function call

func( &a);

&a decays to a pointer to int; &a is not a pointer to pointer to int. Why? there is no pointer to point to.

The function prototype

void func( int **p);

expects a pointer to pointer to int, that does not fit the function being called with a pointer to int as an argument, like you did.

UPDATE: I don't know what the OP's intentions were, so this is just a guess...

void my_func(int *a);

int a[] = {1, 2, 3};

my_func(a); /* note: this is equivalent to my_func( &a ); */


void my_func(int *a)
{
   printf("%d %d %d\n", a[0], a[1], a[2] ); 
}
2011-12-12

相关问答

更多

图灵机二进制计数器(Turing Machine Binary Counter)

它看起来好像你假设每一步都涉及二进制数的增量。 您只运行了8次“步骤”。 但是其中许多步骤根本不涉及更改“磁带” - 在状态0和2中,'head'被移动并且状态被改变但是磁带没有变化。 如果你知道你想要的's'的最终状态(大概是“1000”),那么最简单的方法是用while (!String.valueOf(s).equals("1000"))替换while (c < 8) while (!String.valueOf(s).equals("1000")) 。 It looks to me as

从无签名转换为签名类型安全?(Conversion from unsigned to signed type safety?)

访问是明确定义的,允许您通过指向对应动态类型(3.10 / 15)的有符号或无符号类型的指针来访问对象。 此外,保证signed char不具有任何陷阱值,因此无论原始unsigned char对象的值是什么,您都可以安全地读取signed char指针。 当然,您可以期望通过一个指针读取的值与通过另一个指针读取的值不同。 编辑:关于sellibitze的评论,这是3.9.1 / 1所说的。 char,signed char和unsigned char占用相同的存储空间并具有相同的对齐要求(3.

ObjectReference JDI和JPDA中的底层对象(ObjectReference underlying object in JDI and JPDA)

为什么ObjectReference不公开其底层对象? 我假设您指的是com.sun.jdi.ObjectReference接口。 如果是这样,它是两件事的组合: 从表面上看,它没有意义。 ObjectReference位于运行调试器的JVM中,但目标计算机上存在相应的Java对象。 假设它确实有意义,那么暴露实际的pbject地址和内存内容将是一件坏事。 这将允许调试器对目标JVM执行操作,从而导致硬崩溃。 考虑到你从ObjectReference获得uniqueID()的情况,有没有办法从J

在Intranet中启用跨域脚本(Enabling cross domain scripting in the intranet)

IE8,Firefox 3,最近的Opera和Safari / Chrome支持postMessage,它允许不同域上的合作页面相互通信: http://ajaxian.com/archives/cross-window-messaging-with-html-5-postmessage 如果您遇到旧版浏览器,则几乎没有选择。 最干净的是通过相同的代理发送需要相互通信的所有内容,尽管在OP的情况下看起来这是不可能的。 下一个最干净的是使用Flash的跨域设施。 另一种选择是xssinterfac

在mplot3d中绘制数据以进行绘图(Sorting data for plotting in mplot3d)

如果我理解正确,你只想这样做: x[1::2, :] = x[1::2, ::-1] 。 有一些问题...如果你没有制作x的中间副本,那么由于广播在numpy中的运作方式,它并不能完全达到预期效果。 尽管如此,使用基本索引仍然非常简单: import numpy as np x = np.array([[1,2,3],[3,2,1],[1,2,3],[3,2,1],[1,2,3]]) x_rev = x.copy() x_rev[1::2, :] = x[1::2, ::-1] 这转换了这个(

如何将System.Guid转换为C#中的字符串(How can I cast a System.Guid to a string in C#)

您可以通过调用ToString()来获取GUID的字符串表示形式。 由于您的GUID可以为空,因此在调用ToString()之前检查它是否为null: string myString = guid.HasValue ? guid.Value.ToString() : "default string value"; You can get the string representation of the GUID by calling ToString() on it. As your GUID

datetime.strptime( '2017-01-12T14:12:06.000-0500', '%Y-%间- %的dT%H:%M:%S%F%Z')(datetime.strptime(‘2017-01-12T14:12:06.000-0500’,'%Y-%m-%dT%H:%M:%S.%f%Z'))

Python 2.7的解决方案 从评论中可以清楚地看出OP需要Python 2.7的解决方案。 显然,python 2.7的strptime中没有%z ,即使文档声称相反 ,引发的错误是ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.000%z' 。 要解决此问题,您需要先解析没有时区的日期,然后再添加时区。 不幸的是,您需要为此子类化tzinfo 。 这个答案是基于这个答案 from datetime import

我刚刚安装了VS.NET 2003,这使我的新版本(2005/2008)瘫痪了(I have just installed VS.NET 2003 which left my newer versions (2005/2008) crippled)

rifferte是正确的,因为最安全的是安装在另一个它们被释放。 此时可能最好的做法是修复Visual Studio 2008安装。 您可以通过“控制面板” - >“添加删除程序”菜单执行此操作。 这应该可以解决您所看到的问题。 rifferte is correct in that it's safest to install in the other they are released. Probably the best thing to do at this point is to re

相关文章

更多

最新问答

更多
  • 用于Json解析的Phonegap插件(Phonegap Plugin for Json parsing)
  • ActionScript 2加载另一个加载其他文件的SWF - 相对路径/网址问题(ActionScript 2 load another SWF that loads other files - relative path/url problem)
  • 使用sql将一些列值放入新列中(put some column values in a new column using sql)
  • 在iOS中为NivevehGL设置View的背景图像(Setting the background image of the View for NivevehGL in iOS)
  • 从普通的C#开发人员到普通的Java开发人员需要多长时间?(How long will take from an average C# developer to an average Java developer?)
  • 通过datetimefield SQL Server加入(Joining by datetimefield SQL Server)
  • Python中是否有任何智能打印方法?(Are there any smart print methods in Python?)
  • R中关闭另一个表[关闭](Removing one table from another in R [closed])
  • 枚举数字(Enumerating digits)
  • 我想从现有数组中获取新数组,其中key是旧数组的重复值,value是重复计数?(I want new array from existing array with key as repeated value from old array and value as repeated count?)
  • 如何在不创建实例的情况下调用类方法(How to call a class method without creating an instance)
  • wxHaskell中嵌入的图像(Embedded images in wxHaskell)
  • 蚂蚁战争任务如何运作?(How does the ant war task work?)
  • Windows Workflow 4中的人员活动支持(Human activity support in Windows Workflow 4)
  • 在Firebug的Net Panel中缺少'DomContentLoaded'和'加载'时间信息(Missing 'DomContentLoaded' and 'load' time information in Firebug's Net Panel)
  • 如何抓取页面以查看复选框/广播/文本输入并检测其原始值的更改?(How can I crawl the page for checkbox/radio/text inputs and detect changes to their original values?)
  • Document.ready不起作用(Document.ready won't work)
  • Java序列化问题(Java serialization problem)
  • Javascript:如何在页面刷新时处理令牌验证?(Javascript: How should I handle token verification on page refresh?)
  • 数据库安全:中间“to_be_deleted”列/表?(Database safety: Intermediary “to_be_deleted” column/table?)
  • 使用mayavi时如何删除scalar_cut_plane中的红框和白色箭头?(How to remove the red frame and white arrow in scalar_cut_plane when using mayavi?)
  • 如何延迟MainPage,所以它在加载数据后启动?(How to delay MainPage, so it starts after data is loaded?)
  • 按Enter键更改EditText(Press Enter to change EditText)
  • 使用libavcodec解码时可以裁剪帧大小吗?(Can the frame size be cropped during decoding using libavcodec?)
  • Performance_Python根据元组的3个元素中的2个获得2个元组列表的并集(Performance_Python get union of 2 lists of tuple according to 2 out of the 3 elements of the tuple)
  • 为什么法线会随相机旋转?(Why normals rotate with camera?)
  • 如何将Intent与ListView一起使用?(How do I use Intents with ListView?)
  • html_safe无法使用rails(html_safe not working with rails)
  • 录制没有单独的程序或库的opengl视频(record opengl video without separate program or library)
  • 滚动到特定视图(Scroll to particular view)