为什么 char** 不能自动转化为 const char**

解决 C2664 “char *strcpy(char *,const char *)”: 无法将参数 2 从“CString”转换为“const char *” 在使用旧工程中的函数时, 在VS 2017上编译出现如上问题, 但是该函数在之前的版本上可以正常编译, 怎么会出现这问题呢?难道不向前兼容, 不应该, 一定是哪里没设置好, 在找资料查询之后, 还是找到了, 记录下, 方便大家也方便自己. 1. 编译错误显示图 根据错误提示, 尝试修改字符集, 应该可以解决. 2. 修改字符集, 采用多字节字符集 3. 重新编译 重新编译, 还是出错, 但... 阅读详情

一次偶然的情况下我发现以下代码竟然无法被编译通过(如果你的编译器,比如VC6或VC2003,允许它编译通过,我想你首先应该换个编译器,比如GCC或VC2005):
void foo( const char* [] ) { }
int main( void )
{
    char* s[2];
    foo( s );
}

简化成更一般的形式是:
char** p1 = 0;
const char** p2 = p1;

错误是:invalid conversion from `char**' to `const char**'.

lostpencil更加仔细,使用C编译器给出的是一个警告:
initialization from incompatible pointer type.

随后hpho给出了合理的解释,同时comp.lang.c++.moderated上的Ulrich Eckhardt也用代码进行了说明。

用代码来说明最直观了:
const char* s = "abc";
int main( void )
{
    char* p0 = 0;
    char** p1 = &p0;
    const char** p2 = p1;
// 先假设这一句是合法的 ( 测试时,可以先强制类型转化一下 )
    *p2 = s;
    *p0 = 'A';
// 通过p0在修改不应该被修改的s,这显然和const相违背,其运行结果不可知。
}

实际上 const char** 不是 char** 的const形式,char** 的const形式应该是 char* const *,哈哈!

 
细谈const char ** 与 char ** 的区别 <br />#include "stdafx.h" #include <iostream> using namespace std; int main(int argc, char* argv[]) { const char ** p0=NULL; char ** p1=NULL; p0=p1; } // error C2440: “=”: 无法从“char **”转换为“const char **”<br />      程序出现了错误,很明显是类型转换时类型不匹配(const 阅读详情

相关推荐

C++中为什么char**不能转换成const char**? 探索C语言和C++中const的美丽故事

本文从一个大家很可能遇到的C++bug中引出对C/C++历史的探索, 并通过实验等方式结合资料分析了这个bug的根源问题, 最后给出了多种优秀的解决方案。

weixin_43558951的博客 2343

关于不能将char** 类型转化为 const char**

对于二级指针来说,不能将char** 类型转化为const char** 类型。 const char x = 31; char y = 41; char *q = &y; &x的类型显然为 const char *, &q的类型是char **,  假设能将char **类型转化为 const char **, 那么可以另外定义一个变量:

zhouguoqionghai的博客 5433

脑电数据预处理八:基于 ICA 的伪迹去除

摘要: 脑电图(EEG)数据分析中,伪迹(如眼电、心电、肌电)与脑电信号频谱重叠时,独立成分分析(ICA)成为有效工具。ICA通过盲源分离将混合信号分解为统计独立的成分,识别并移除伪迹后重建干净信号。MNE-Python实现步骤包括:数据预处理(滤波、坏导处理)、ICA分解、人工与自动结合识别伪迹成分、剔除后重建数据。实践建议强调人工检查的重要性,避免过度使用ICA,并保存模型以提高效率。该方法显著提升数据质量,为后续分析奠定基础。

qq_32516809的博客 1658

char**为何无法转为const char**?——对const的进一步探讨

在优快云上的论坛中,我已经发表过两篇关于const的用法以及修饰方式。这里想更深入地探究const的本质问题。我们都这么用过:char a = 0;const char *p = &a; 也就是说char*可以转为const char*。这个是合法的,因为const char*意味着该指针变量指向char类型变量的地址,任何通过p来指向变量a地址的指针变量只能用const*来

zenny_chen的专栏 2873

STM32 RT-Thread 系统分析(1)- 启动文件

RT-Thread STM32 系统分析(1)- 启动文件前言基本信息前言说明三级目录 前言 基本信息 名称 描述说明 RT-Thread Studio 软件版本 版本: 1.1.3 RT-Thread 系统版本 4.0.2 STM32CubeIDE 软件版本 1.4.0 STM32芯片型号 STM32F013VG 前言说明 使用了STM32CubeIDE 和 RT-Thread Studio 建立了相同型号芯片的工程,对比其中启动文件内容差异如下: 左侧是RT-Threa

鸳鸯冰笔的博客 4096

PyTorch实战:A2C算法在Pendulum环境中的调参技巧与收敛优化

本文详细介绍了使用PyTorch实现A2C算法在Pendulum环境中的调参技巧与收敛优化方法。通过分析Pendulum环境特性、设计高效的网络架构、优化超参数设置以及提升训练稳定性,帮助开发者掌握强化学习中的policy-based方法。文章特别强调了奖励工程、优势估计改进和梯度裁剪等关键优化策略,为连续控制任务提供了实用解决方案。

rum55的博客 213

[转]CString、TCHAR*、char*转换

Unicode 模式下 CString 和 Char *相互转换 CString 转 Char* 方法一:   CString info(_T("测试。");   LPCSTR tmp;   USES_CONVERSION;       tmp = W2A( info.GetBuffer( ) ); 方法二:   CString info(_T(

7946

使用3sigma原则去除数据表中的极端值

本文使用3sigma解决数据表中出现的极端值问题,其中包括基本原理、使用原则(检验方法)、代码展示这3个部分

qq_51397866的博客 4377

java中charconst_为什么 char** 不能自动转化为 const char** (转)

一次偶然的情况下我发现以下代码竟然无法被编译通过(如果你的编译器,比如VC6或VC2003,允许它编译通过,我想你首先应该换个编译器,比如GCC或VC2005):void foo( const char* [] ) { }int main( void ){char* s[2];foo( s );}简化成更一般的形式是:char** p1 = 0;const char** p2 = p1;错误是:i...

weixin_29147347的博客 236

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 797

[C++] 为什么const char**形参不能接收char**类型的实参?

我们知道,const存在的意义之一,就是在对形参进行限定,从而达到防止修改实参的作用。使用const形参的理由有如下三条:

FightFightFight的博客 2441

Tessent ATPG Flow 流程 (代码和注释)

**摘要:Tessent ATPG流程分为五个阶段:1) 环境初始化(加载设计文件、库和扫描链配置);2) DRC规则检查(验证设计可测试性并修复违例);3) ATPG向量生成(设置故障模型并运行引擎优化覆盖率);4) 向量验证与后处理(仿真验证并生成ATE格式文件);5) 进阶操作(多电压域和存储器测试)。流程输出包括测试向量、覆盖率报告和验证日志,支持stuck-at和transition故障模型,使用Tcl脚本控制。关键步骤包含扫描链配置、EDT压缩和覆盖率优化。

QQ_778132974的博客 929

C语言中的const char,C语言中为什么不能把char**赋给const char**

标签:c指针这是我在知乎回答的一个问题.这个问题是C中的一个深坑,首先说结论:char ** 和 const char ** 是两个不相容(incompatible)的类型,可以理解为不能直接赋值在C11的6.5.2.2 Function calls中有如下内容Each argument shall have a type such that its value may be assigne...

weixin_36481714的博客 947

Unitree G1仿人机器人协同搬箱:从仿真搭建到多机协同部署完整指南

Unitree G1仿人机器人协同搬箱技术方案摘要 本文提供了一套完整的Unitree G1人形机器人协同搬箱解决方案,涵盖从仿真环境搭建到多机协同部署的全流程。核心内容包括: 双仿真环境配置:同时搭建Gazebo+ROS Noetic基础仿真环境与Isaac Gym+Mujoco高性能RL训练环境,支持Sim2Sim迁移验证 训练框架搭建:详细配置unitree_rl_gym框架,提供PPO算法定制化训练流程和参数优化方案 数据集应用:整合宇树开源真机数据集(UnifoLM-WBT-Dataset)~~~

huanghm88的专栏 471

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

实参char**与形参const char **为什么不相容

今天早上被小六打电话给吵醒了,呜呜,人家还没睡醒好不好。翻开书本,看到之前看到的一个东西,有两个问题:         -----------------------------------question------------------------------------------------------------------------ 第一个问题是实参char *与形参con

sinat_31586167的博客 1996

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

从char**无法赋给 const char**的原因,谈谈const限定符

作者:gfree.wind@gmail.com 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net    本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 =========================

doudou0918的专栏 1046

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

const char **与char ** 的传参问题

当我们使用这一代码测试时 #include<iostream> using namespace std; void foo(const char **a) { cout << "123"; } void main() { char b = 'x'; char* a = &b; char** v = &a; foo(v); cout << (void*)&b<<"\n"<<&a<<"\n"&lt

weixin_43892561的博客 2998

为什么我不能向接受const char ** 的函数传入char **?

 编译sv/feature/cluster 下面这行rc = nsr_cluster_insert2db(key_image);  出错:test.c|47| error: invalid conversion from ‘char**’ to ‘const char**’ 但是在我 的测试程序中,仅仅给出了警告:#include int main() {    char **_p;    fun

ThinkHY的专栏 1687

为什么不能向接受const char **的函数出入char ** ?

问:为什么不能向接受const char **的函数传入char **?   答:定理:允许向接受const T的指针的地方传入T型指针,任何类型T都适用。但是,这种允许,也即在被限定的指针类型上轻微不匹配的规则却不能递归应用,只能应用在最上层。由此就可以回答上面的问题了,因为const char **是const char的指针的指针,所以这个规则在这时就不适用了。          co

zhangzhi123456789的专栏 7283

c语言 16进制赋给char,C语言中为什么不能把char**赋给const char**

这是我在知乎回答的一个问题.这个问题是C中的一个深坑,首先说结论:char ** 和 const char ** 是两个不相容(incompatible)的类型,能够理解为不能直接赋值在C11的6.5.2.2 Function calls中有例如以下内容Each argument shall have a type such that its value may be assigned to an...

weixin_39616503的博客 461

C语言const与指针——为什么不能用char **给const char **赋值

C语言中,const限定词指定了一个不可修改的变量,但并不是常量。它可以使编译器帮助我们保证某些变量不被意外修改,例如指针或引用传递时,加上const可保证我们的源数据不被破坏。const修饰指针时情况比一般情况下要复杂许多,先看下面这个例子: 1 const char * p1;//p1指向的内容不可变2 char const * p2;//p2指向的内容不可变3 char * const

sunnylgz 3245

char** 和const char** 问题

目录1、char** 和const char** 问题:2、NUL和NULL问题:3、sizeof返回值问题:4、malloc下的strlen问题:今天看书看到一个很有意思的问题,不过在看问题之前,首先得知道一个知识:这个问题从一个程序开始:程序1: 这个问题其实是要我们判断形参实参是否对应,按上面的预备知识,就是转换为判断“ const char** ”、“char**”这两个类型的数据能不能互相赋值。当时我看到这个程序,我第一感觉就是这个程序是有问题的,两个指针类型不相符嘛,一个有con

m0_61151031的博客 899
上一篇: 一个C++ 内存泄漏检测器
下一篇: Data Alignment
undefined_behavior
博客等级 码龄19年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值