首页 \ 问答 \ 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

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 如何在datarow []中的列中找到最大值?(How to find max value in a column in a datarow[] ?)
  • 如何使用预定义文本替换来自数据库的部分结果(How do I replace part of result coming from Database with predefined text)
  • Selenium Java注入了新的Javascript函数(Selenium Java inject new Javascript function)
  • 使用.on的多个下拉菜单选择文本仅适用于第一个下拉列表(Multiple Dropdowns Menu Selection text using .on works only on first dropdown)
  • 快速将黄土曲线添加到大型数据集图中的方法(Quick way to add loess curve to large data set graph)
  • FilteringSelect in mvc(FilteringSelect in mvc)
  • 在Delphi XE2中开发Mac或iOS应用程序需要哪些硬件/软件?(What hardware/software is necessary to develop Mac or iOS apps in Delphi XE2?)
  • 在原型的构造函数中初始化属性时获取“未定义”(Getting 'undefined' when a property is initialized in the constructor of a prototype)
  • 通过越狱加载的应用程序的Documents文件夹位置(Location of Documents folder for an app loaded via jailbreak)
  • 在OpenGL中使用可编程和固定管道功能(Using both programmable and fixed pipeline functionality in OpenGL)
  • 将任何用户输入重定向到单独的底层程序(redirect any user input to a separate underlying program)
  • 编辑文本不能正常工作android(Edit texts not working properly android)
  • “user_denied”Facebook应用页面上的Facebook用户区域设置(Facebook user locale on “user_denied” facebook app page)
  • 在大图像中找到小的部分透明图像的坐标(find coordinates of small partially-transparent image within a large image)
  • 我如何在cakephp 3.1中获得完整的相对路径?(How i can get full relative path of image in cakephp 3.1?)
  • 如何保存拖动标记的新本地化?(How to save new localization of dragged marker?)
  • MySQL UPDATE vs INSERT和DELETE(MySQL UPDATE vs INSERT and DELETE)
  • 在执行查询之前,在SQLAlchemy模型中将datetime转换为unix时间戳?(Convert datetime to unix timestamp in SQLAlchemy model before executing query?)
  • OpenCL与OpenGL互操作的优势(Advantage of OpenCL interoperability with OpenGL)
  • 如何解析用点和等分隔的数据然后添加到listview(How to parsing data from delimited with dot and equal then add to listview)
  • 带调试输出的X3解析器段错误(BOOST_SPIRIT_X3_DEBUG)(X3 parser segfaults with debug output (BOOST_SPIRIT_X3_DEBUG))
  • 将文件夹名称添加到fgrep结果(Add folder name to fgrep result)
  • 在MySQL中加载一个表是非常慢的(Loading one table in MySQL is ridiculously slow)
  • 如何将JSON放入PHP变量?(How do I put JSON into a PHP Variable?)
  • 如何绕过Microsoft.Speech.Recognition中的不流畅?(How to bypass disfluencies in Microsoft.Speech.Recognition?)
  • 原点的最后一行是什么?(What is the last row of an origin for?)