C数组数组:为什么我需要在此处强制转换为const?

panzi

为什么需要更改print_args此代码中调用print_args(argc, (const char**)argv)才能进行编译?

#include <stdio.h>

void print_args(int argc, const char *argv[]) {
    for (int i = 0; i < argc; ++ i) {
        puts(argv[i]);
    }
}

int main(int argc, char *argv[]) {
    print_args(argc, argv);
    return 0;
}

当我用gcc编译时,出现此错误:

$ gcc -Werror -std=c99 -g const.c -o const
const.c: In function ‘main’:
const.c:10:2: error: passing argument 2 of ‘print_args’ from incompatible pointer type [-Werror]
const.c:3:6: note: expected ‘const char **’ but argument is of type ‘char **’
cc1: all warnings being treated as errors

(请注意,这只是一个简化的示例代码来说明问题。)

乌鸦

comp.lang.c常见问题对此有一个问题,总结为:

无法char **const char **指针分配的原因有些模糊。考虑到const限定词的存在,编译器希望帮助您信守承诺,不要修改const值。这就是为什么您可以将a分配char *给a const char *,而不是相反:将“ const- ”添加到简单指针显然是安全的,但是将其删除很危险...在C中,如果必须分配或传递在第一个间接级别之外具有限定符不匹配的指针,则必须使用显式强制转换

这是它给出的示例,其中第3行应给出警告:

const char c = 'x';         /* 1 */
char *p1;                   /* 2 */
const char **p2 = &p1;      /* 3 */
*p2 = &c;                   /* 4 */
*p1 = 'X';                  /* 5 */

第1行和第2行显然很好。在第4行,&c有型pointer to const char,而且由于char **是类型pointer to pointer to const char,那么*p2也是类型pointer to const char,所以声明是好的。第5行也很好,因为它p1是type pointer to char,所以您可以修改它指向的内容。

所以,如果第3行是行,那么你最终究竟做你所期望的const,以防止你做,修改char指向的一个pointer to pointer to const char,所以第3行是容许的,你不能分配char **const char **没有投。

请注意,强制转换只是隐藏了问题,并不能解决问题。如果您添加了强制转换,则上面的第3行将可以正常工作,并且您可以间接地显然地修改const char尽管并非总是如此,但这是一个很好的例子,表明屈从于明显的强制转换C常常只是一个错误。

请注意,在C ++中,您可以声明函数参数,const char * const * argv并且该函数参数无需强制转换即可工作,并可以防止间接修改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我是否需要在此处装箱?

来自分类Dev

为什么我需要在此Powershell此处字符串中转义最后一个单引号?

来自分类Dev

为什么我的jQuery .map无法在此处组合数组?

来自分类Dev

为什么我需要在C#显式实现中将'this'转换为接口类型?

来自分类Dev

为什么将a从数组强制转换为指针会破坏我的数据?

来自分类Dev

在C语言中,为什么我们需要将char *强制转换为void?

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么需要在Typescript中键入强制类型转换?

来自分类Dev

为什么需要在此C ++模板中指定类型?

来自分类Dev

为什么强制转换Object []数组是错误的?

来自分类Dev

为什么我需要在数组中附加一个 NUL 字符?

来自分类Dev

为什么选择查询返回数据作为元组,我需要在 python 中关联数组

来自分类Dev

为什么必须将参数强制转换为const?

来自分类Dev

为什么将枚举数组强制转换为两种不同的IEnumerable <T>类型?

来自分类Dev

为什么将数组强制转换为IEnumerable忽略延迟执行?

来自分类Dev

为什么初始化指针时必须将数组强制转换为type []?

来自分类Dev

为什么需要强制转换为布尔?

来自分类Dev

为什么将值转换为数组?

来自分类Dev

为什么在将其强制转换为void *类型之前需要复制Objective-C处理程序?

来自分类Dev

为什么需要在C中的字符串数组中声明字符串的长度?

来自分类Dev

为什么在强制转换为字节之前需要强制转换为Float?

来自分类Dev

为什么我的指针算法在此数组中失败

来自分类Dev

为什么我需要在此React方法上使用这些花括号

来自分类Dev

将此char数组强制转换为函数有什么作用?

来自分类Dev

为什么在此Java示例中需要强制转换HttpURLConnection?

来自分类Dev

为什么 JavaScript 不将类数组对象转换为数组?

来自分类Dev

为什么我必须强制转换为界面?

来自分类Dev

为什么必须在此宏中将NULL强制转换为类型?

Related 相关文章

  1. 1

    我是否需要在此处装箱?

  2. 2

    为什么我需要在此Powershell此处字符串中转义最后一个单引号?

  3. 3

    为什么我的jQuery .map无法在此处组合数组?

  4. 4

    为什么我需要在C#显式实现中将'this'转换为接口类型?

  5. 5

    为什么将a从数组强制转换为指针会破坏我的数据?

  6. 6

    在C语言中,为什么我们需要将char *强制转换为void?

  7. 7

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  8. 8

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  9. 9

    为什么需要在Typescript中键入强制类型转换?

  10. 10

    为什么需要在此C ++模板中指定类型?

  11. 11

    为什么强制转换Object []数组是错误的?

  12. 12

    为什么我需要在数组中附加一个 NUL 字符?

  13. 13

    为什么选择查询返回数据作为元组,我需要在 python 中关联数组

  14. 14

    为什么必须将参数强制转换为const?

  15. 15

    为什么将枚举数组强制转换为两种不同的IEnumerable <T>类型?

  16. 16

    为什么将数组强制转换为IEnumerable忽略延迟执行?

  17. 17

    为什么初始化指针时必须将数组强制转换为type []?

  18. 18

    为什么需要强制转换为布尔?

  19. 19

    为什么将值转换为数组?

  20. 20

    为什么在将其强制转换为void *类型之前需要复制Objective-C处理程序?

  21. 21

    为什么需要在C中的字符串数组中声明字符串的长度?

  22. 22

    为什么在强制转换为字节之前需要强制转换为Float?

  23. 23

    为什么我的指针算法在此数组中失败

  24. 24

    为什么我需要在此React方法上使用这些花括号

  25. 25

    将此char数组强制转换为函数有什么作用?

  26. 26

    为什么在此Java示例中需要强制转换HttpURLConnection?

  27. 27

    为什么 JavaScript 不将类数组对象转换为数组?

  28. 28

    为什么我必须强制转换为界面?

  29. 29

    为什么必须在此宏中将NULL强制转换为类型?

热门标签

归档