【问题标题】:How is the string literal argument interpreted when passed as parameter in function?在函数中作为参数传递时如何解释字符串文字参数?
【发布时间】:2015-11-13 19:08:02
【问题描述】:

我需要帮助才能掌握一些东西。目前我正在使用少量内存(ROM(FLASH),RAM)的微控制器平台上测试代码。 这是代码

void print(const char * c)
{
   printf("%#4x, ",c);
   printf("%s\n",c);
}

这是函数调用

print("Riko");

输出为:0x5C4C, Riko

内存地址 0x5C4C 驻留在 FLASH(主代码内存)中,所以文字字符串 "Riko" 也必须驻留在该内存段中?我的问题是:当我们将"Riko" 作为参数传递给函数print 时,这实际上是否意味着我们将字符串"Riko"((const char*) 0x5C4C) 的第一个字符的地址作为参数传递给函数print ?非常感谢...

【问题讨论】:

  • 您应该使用%p 打印指针(并将参数转换为void *)。
  • @Kninnug 请阅读6.2.5p28(以及它后面的脚注)
  • @Freenode-newbostonSebivor 不适用于可变参数函数,例如printf。请阅读this answer
  • @Kninnug 实际上,我引用的段落(以及它后面的脚注)确实适用于这种特定情况,尽管您的引用不适用(并且不是专制的,如果我可能会补充)......脚注说,如果你不介意阅读它,“相同的表示和对齐要求意味着暗示可互换性作为函数的参数,函数的返回值和联合成员。”不幸的是,您引用的答案没有考虑到这一点......

标签: c


【解决方案1】:

当我们将“Riko”作为参数传递给函数 print 时,是否 实际上意味着我们传递的第一个字符的地址 字符串“Riko”

是的,这意味着,但是,对于打印地址,您应该使用:

   printf("%p", (void*)c);

【讨论】:

  • 注意: 虽然(强制符合标准)强制转换为 void* 似乎是多余的(在我所知道的所有现代平台上,),它确实有一个理由:在某些平台上,指针可以根据指向的类型具有不同的表示形式,因此必须进行强制转换以确保指针以 printf() 期望的表示形式传递。但就个人而言,在符合 C99 的平台上,我会使用内联函数来享受演员阵容的隐含性:const void* tovoid(const void *p) { return p; }
  • @Medinoc 在这种情况下,它是无用的冗余,即使在古老的平台上,void * 也需要与char * 具有相同的表示和对齐要求。请参阅6.2.5p28(以及其后的脚注)。
【解决方案2】:

是的。根据section 6.3.2.1, paragraph 3 of the C standard...

除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type'' 的表达式将转换为类型为“类型指针”的表达式,它指向数组对象的初始元素,并且不是左值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多