使用数组调用 vararg 函数?

2023-12-27

在下面的示例中,我想将数组的内容传递给接收可变数量参数的函数。

换句话说,我想传递给printf的内容foo按值传递这些参数,从而将这些参数传递到堆栈上。

#include <stdarg.h>
#include <stdio.h>

void main()
{
    int foo[] = {1,2,3,4};

    printf("%d, %d, %d, %d\n", foo);
}

我知道这个例子看起来很愚蠢,因为我可以使用printf("%d, %d, %d, %d\n", 1,2,3,4);。想象一下我正在打电话void bar(char** a, ...)相反,数组是我从 RS232 收到的东西......

EDIT

换句话说,我想避免这种情况:

#include <stdarg.h>
#include <stdio.h>

void main()
{
    int foo[] = {1,2,3,4};

    switch(sizeof(foo))
    {
       case 1: printf("%d, %d, %d, %d\n", foo[0]); break;
       case 2: printf("%d, %d, %d, %d\n", foo[0], foo[1]); break;
       case 3: printf("%d, %d, %d, %d\n", foo[0], foo[1], foo[2]); break;
       case 4: printf("%d, %d, %d, %d\n", foo[0], foo[1], foo[2], foo[3]); break;
       ...
    }
}

我想按值将 foo 的内容传递给 printf ,从而将这些参数传递到堆栈上。

您不能按值传递数组。不是通过“正常”函数调用,也不是通过可变参数(基本上,这只是一种不同的方式reading堆栈)。

每当您使用数组作为函数的参数时,调用的函数是什么receives是一个指针。

最简单的例子是 char 数组,又名“字符串”。

int main()
{
    char buffer1[100];
    char buffer2[] = "Hello";
    strcpy( buffer2, buffer1 );
}

What strcpy()“看到”不是两个数组,而是两个指针:

char * strcpy( char * restrict s1, const char * restrict s2 )
{
    // Yes I know this is a naive implementation in more than one way.
    char * rc = s1;
    while ( ( *s1++ = *s2++ ) );
    return rc;
}

(这就是为什么size数组的大小仅在数组所在的范围内已知declared一旦你传递它,它只是一个指针,没有地方放置大小信息。)

将数组传递给可变参数函数也是如此:最终出现在堆栈上的是pointer到数组(的第一个元素),而不是整个数组。

You can通过引用传递数组并用它做有用的事情在被调用的函数中,如果:

  1. 您传递(指向)数组的指针和元素计数 (think argc / argv), or
  2. 调用者和被调用者就固定大小达成一致,或者
  3. 调用者和被调用者同意数组以某种方式“终止”。

标准printf()最后一个是为了"%s"和字符串(以'\0'), but 不具备这样做的能力,如您的示例所示,int[]大批。所以你必须编写自己的自定义printme().

在任何情况下,您都不会“按值”传递数组。如果您考虑一下,对于较大的数组来说,将所有元素复制到堆栈中并没有多大意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用数组调用 vararg 函数? 的相关文章

  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 我可以重新调整旧的提交吗?

    我刚刚开始使用 git Rebase 是很棒的东西 我应该在之前的特定案例中使用它 为了清晰的提交 是否有一种完全可以接受的方法来重新调整旧提交的基础 您应该只对尚未推送到上游的提交执行此操作 也就是说 我发现最容易使用git rebase
  • false 的未定义方法 `+@':FalseClass (NoMethodError) ruby

    def next prime number last known prime while true last known prime found factor false ERROR for i in 1 last known prime
  • 如何从库中启动 Android 应用程序中的 Activity

    我在 Android Studio 中有一个 Android 应用程序 我已经在应用程序中添加了一个库 按钮 视图和活动在库中定义 当我单击按钮时 我需要导航到应用程序中定义的活动 通常 为了导航到另一个页面 我们使用意图 如下所示 Int
  • 如何本地化 iOS info.plist 文件中的字符串?

    As you might know the iOS 8 requires NSLocationWhenInUseUsageDescription key for using user s location I have added this
  • 有没有办法将外部 Javascript 作为 Jasmine 的来源?

    我正在尝试配置 jasmine yml 使用 jasmine gem 以使用 Google API 提供的 JQuery 而不是将其本地下载到我的服务器 IE src files ajax googleapis com ajax libs
  • Lubuntu 中的多个光标 - Shift + Alt + 箭头(向上/向下)

    在使用时 多光标功能对我来说非常有效Xubuntu https en wikipedia org wiki Xubuntu 我最近安装了Lubuntu https en wikipedia org wiki Lubuntu非常失望的是 我意
  • std::vector::iterator 可以简单地是 T* 吗?

    简单的理论问题 简单的指针是否是有效的迭代器类型std vector 对于其他容器 例如列表 地图 这是不可能的 但是对于std vector所保存的数据保证是连续的 所以我认为没有理由不这样做 据我所知 一些实现 例如 Visual St
  • html 重置后,javascript 事件丢失

    我遇到过这样一种情况 div 的 html 内容有时会更改为其他内容 然后又更改回来 一些 jquery ui 控件行为不当 我已将问题简化为以下代码片段 它基本上表明与按钮关联的事件处理程序不再触发 我假设这些在它们消失后的某个时刻被垃圾
  • phoneGap (Cordova) 内部如何工作,特定于 iOS

    我已经开始为多个平台开发 html 应用程序 我最近听说了 Cordova 2 0 PhoneGap 从那时起我就很好奇这座桥是如何工作的 经过大量代码检查后 我发现 Exec js 是 JS gt Native 调用发生的代码 execX
  • 使用 Odata 查询基于 EF 的 DTO

    我有一个 ASP NET Core Web API 设置 其中包含 SQL Server 数据库和 EF 数据模型 版本 EF Microsoft EntityFrameworkCore 5 0 0 预览版 7 20365 15 OData
  • jQuery $.get 在 Chrome 中不起作用

    解决方案不起作用 在浪费了一整天学习前端 Web 开发之后 我将进度条放入 iframe 中 该 iframe 在 jquery 对话框内启动 期望 ajax get 请求从该页面开始工作 不幸的是我收到了完全相同的行为 发现问题 当您按
  • sonarqube“新代码”定义

    关于默认的质量门 奇怪的是 我们不清楚 新代码 的定义 为了说明这一点 假设我们通过添加新代码来更改文件 默认声纳质量门分析是仅对新代码行还是整个文件进行 我们不清楚 但怀疑这是整个文件 同事告诉我 项目未通过质量关卡 因为带有预先存在的阻
  • 形状渐变

    我正在尝试在按钮上执行渐变 但无法使其具有与按钮其他部分相同的渐变 我尝试在渐变中添加渐变 但它似乎不起作用并且找不到解决方案 这是我正在使用的代码 button color white padding 3px 3px 3px 0px bo
  • 如何将 CSV / MySQL 数据初始批量导入 Neo4j 数据库

    我正在考虑用 neo4j 数据库替换 MySQL 数据库 我是 neo4j 的初学者 想知道如何将我当前的 MySQL 数据批量插入到 neo4j 数据库中 以便我可以进行实验并开始了解 neo4j 关系数据库由4个表组成 Person O
  • 检索函数的返回类型而不调用该函数

    假设我在 TypeScript 中有一个这样的函数 export const foo function return a 1 b true c bar 如果我将此函数导入到另一个文件中 import foo from foobar 我的问题
  • 克隆 HashSet 的有效方法?

    前几天我回答过一个有趣的问题 https stackoverflow com questions 3897568 substract hashsets and return a copy就这样关于HashSet
  • 如何使用最小起订量模拟 ConfigurationManager.AppSettings

    我陷入了我不知道如何模拟的代码点 ConfigurationManager AppSettings User 我必须模拟 ConfigurationManager 但我不知道 我正在使用Moq http code google com p
  • Android:如何将解码器集成到多媒体框架

    最近我成功地将视频解码器移植到Android 还将输出转储到 SurfaceView 上并使用本机 API 检查输出 现在下一个任务是实现播放 暂停 流媒体等 即媒体播放器的其他功能 这样做将需要返工 因为所有这些功能都已在 Android
  • Lisp中函数参数是如何存储的?

    我假设传递给 Lisp 函数的值被分配给与参数名称匹配的引号 然而 令我惊讶的是 defun test x print eval x test 5 不起作用 变量 x 未绑定 因此 如果参数在函数中不存储为符号 那么本例中的 x 到底是什么
  • 使用数组调用 vararg 函数?

    在下面的示例中 我想将数组的内容传递给接收可变数量参数的函数 换句话说 我想传递给printf的内容foo按值传递这些参数 从而将这些参数传递到堆栈上 include