c - 为什么这允许从 (char *) 提升到 (const char *)?

标签 c

假设 scanf 在 documentation from Microsoft 中有 (const char *)以及 this question 的答案当我将 (char **) 提升为 (const char **) 时,到底发生了什么?

基本上为什么要编译?

#include <stdio.h>
int main(int argc, char **argv)
{   
    char szArray[50];
    int  i = 0;
    strcpy(szArray,"10");
    /* the following code is upcasting the (char *) to (const char *) */
    sscanf(szArray,"%d",&i);
    return 0;  
}

为什么不能编译?

#include <stdio.h>
void processargs(const char **p)
{ 
}
int main(int argc, char **argv)
{
    processargs(argv);          
    return 0;  
}

两者似乎都在对指针做同样的事情!

最佳答案

char** -> const char ** 是危险的,因为您最终可能会不小心修改底层的 const 对象。

正确的写法是:

void processargs(const char * const *p)
{ 
}

关于c - 为什么这允许从 (char *) 提升到 (const char *)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/766386/

相关文章:

c - 此代码如何列出文件夹中的所有项目?

c - 如何获取输入的第二个字符串

c - XML 文档如何与 GTK 一起工作来创建用户界面?

c - libjpeg:一次处理所有扫描线

c - 如何使用 fscanf() 逐行读取 C 中的某个文件而不会出现幻象行?

c - 具有互斥资源的多线程程序

c - 在 C 中按值传递字符串

c - x86_64 处理器的 sync(2) Linux 函数调用的定义在哪里

c - 使用多个进程读取文件并通过pipe()发送数字

c - 调用 trylock() 后解锁互斥量