error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive]

2023-11-09

#include <stdio.h>
#include<malloc.h>
#define IN
#define OUT

// 获取文件大小
int FileSize(IN char *file)
{
	FILE *fil;
	fil = fopen(file,"rb");
	fseek(fil,0L,SEEK_END);
	int filesize = ftell(fil);
	fseek(fil,0,0);
	return filesize;
}

// 读取文件
int ReadFileData(IN char *fileName, OUT char *filedata)
{
	FILE *fpIN;
	int fileSizes = FileSize(fileName);
	fpIN = fopen(fileName,"rb");
	fread(filedata,1,fileSizes,fpIN);
	fclose(fpIN);
}

// 写入文件
int WriteToFile(char *filedata, int size, OUT char *outFileName)
{
	FILE *fpOUT;
	fpOUT = fopen(outFileName,"w+");
	fwrite(filedata,1,size,fpOUT);
	fclose(fpOUT);
}

int main()
{
	char *origin_file = "test.cpp";
	int orgfilesize = FileSize(origin_file);  // 获取文件的大小



	char *file_data=  malloc(orgfilesize);      // 分配文件大小的内存
    if (file_data == NULL)
        return NULL;
	ReadFileData(origin_file, file_data);     // 读取文件
	char *outFile = "test.txt";
	WriteToFile(file_data,orgfilesize,outFile);  // 写出文件

	return 0;
}

 其中下面这行代码

char *file_data=  malloc(orgfilesize);

malloc函数是C语言中分配空间所用, 返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换任何其它类型的指针。

malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,
这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,
这要看malloc()函数中参数size的具体内容。

使用gcc编译直接通过并打印出下面的结果

Original String: testing.


当使用g++编译时,会出现一个错误和警告,如下

error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

     出现error的原因是C++设计得比C更加安全,它不能自动地将void *转换为其它指针类型。

而出现warning的原因则是程序试图将字符串字面值(在C++中字符串字面值为const char []类型,而在C语言中则为char []类型)转换为char *类型,,

char *file_data= (char*) malloc(orgfilesize); 
# malloc函数的返回值是一个 void* ,赋值给变量,需在malloc前面加个强制转换

malloc函数简介
        malloc函数在C语言和C++中经常使用,为变量动态分配内存空间。malloc 向系统申请分配指定size个字节的内存空间

函数原型 void malloc(int size)

说明:

        malloc 向系统申请分配指定size个字节的内存空间。如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
该函数包含在头文件:#include <malloc.h>中 ,使用时需导入头文件*<malloc.h>或者<stdlib.h>** 

注意:当内存不再使用时,应使用free()函数将内存块释放。
 

常见用法

1、在不知道变量需要的确定内存时

比如在定义一个数组时,数组的大小在程序编译后才知道,这时可以用malloc函数

int main()
{
	int n;
	scanf("%d",&n);
	int *m=(int *)malloc(sizeof(int)*n);  //定义了一个指向n个int的	 指针变量,相当于开了一个n个int元素的数组。
	//如果n很大,超过1000000,那么开一个这么大的int型数组就会发生栈溢出。
	int m[1000000]; //会发生栈溢出。
	return 0;
}

2、为结构体变量分配空间。
定义一个结构体类型的普通变量,可以不malloc动态申请内存,CPU会为结构体变量分配内存 。

typedef struct
{
    int n;
    char *p;
}node;

int  main()
{
	node a;  //定义的是结构体普通变量,可以不使用malloc申请内存,CPU会为这个结构体变量分配内存
    a.n=4;
    printf("%d",a->n);  //可以成功输出
    node *b;  //定义的是结构体指针变量,CPU会为这个指针开辟内存,大小为4个字节。但是要存储结构体的数据成员这个空间不够,会引发段错误,此时必须要malloc申请一个结构体类型大小的动态内存,存储数据成员。
    //b=(node *)malloc(sizeof(node));
    printf("%d",sizeof(b)); //用sizeof(b)查看b的大小为4
    char p[]="abcd";
    printf("%d",b->n);
    (a->p)=p;
    printf("%c",a->p[0]);
    return 0;
}

没有使用malloc为结构体指针变量b分配空间,会报warning: ‘b’ is used uninitialized in this function [-Wuninitialized]|。

3、在定义结构体时需要注意,要依次为其成员分配空间。
        在平常使用过程中,在用malloc函数为某个结构体分配空间后,在对其成员变量(指针类型)进行操作。

比如 令该指针 p=NULL时,总会报“Program received signal SIGSEGV, Segmentation fault."
使用malloc函数

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

error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive] 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有

随机推荐

  • GPT3.5 VS GPT-4写领导讲话稿,谁是最强笔杆子?

    正文共 1240 字 阅读大约需要 5 分钟 文秘 公务员必备技巧 您将在5分钟后获得以下超能力 快速生成领导讲话稿 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 图片由Lexi
  • 钢条切割(dp解法)

    1 问题描述 Serling公司购买长钢条 将其切割为短钢条出售 切割工序本身没有成本支出 公司管理层希望知道最佳的切割方案 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi i 1 2 单位为美元 钢条的长度均为整英寸
  • 无法打开包括文件:“QtNetwork”: No such file or directory

    QTCN社区 gt Qt基础编程 gt fatal error C1083 无法打开包括文件 QtNetwork No such file or directory 打印本页 登录 注册 回复主题 发表主题 zhubangbing 2008
  • docker安装mysql

    拉取mysql镜像 docker pull mysql 5 7 启动 docker run itd name mysql p 3307 3306 e MYSQL ROOT PASSWORD root mysql 5 7
  • 自组织特征映射网络(SOFM)

    1 SOFM简介 自组织特征映射网络SOFM又称自组织映射网络SOM 是一种自组织竞争神经网络 一个神经网络接受外界输入模式时 将会分为不同的对应区域 各区域对输入模式具有不同的响应特征 而且这个过程是自动完成的 其特点与人脑的自组织特性相
  • Ocaml——Let

    1 并行定义 如果这个变量在并行定义之前没有定义过 那么会出现变量无定义的错误 例如 2 Let局部定义 语法格式如下 let lt 变量 gt lt 表达式1 gt in lt 表达式2 gt 在这个格式中 变量不再是全局有效的变量 他的
  • linux 系统启动盘制作方式

    文章目录 linux 系统启动盘制作方式 制作镜像 制作系统盘 linux 系统启动盘制作方式 制作镜像 解压iso 一定要带着 discinfo productinfo treeinfo 在替换的软件包的Packages 同级目录执行 c
  • 根据获取的经纬度查询用户位置的距离

    在实现需求的时候难免会遇到根据经纬度要获取距离用户定位的位置的距离 今天就跟大家介绍一下怎么使用sql语句获取到距离用户定位位置的距离 要获取用户位置跟店铺的距离需要一些必要参数 第一 必须要获取到用户定位的经纬度 第二必须要有你要查询距离
  • WEB漏洞测试——HTML注入及XSS注入

    HTML注入 原理 目前我们所接触展示页面基本上都是由html来实现的 那么后台在处理内容的时候 是对html很少处理的 如果用户刻意通过输入框 文本框 查询框来填写html js代码 脚本注入 那么就会造成漏洞 若填写恶意网站 病毒网站
  • 基于Qt开发的游戏手柄小程序例子

    以前做过一个项目 用游戏手柄链接上位机软件 控制下位机执行一些机械动作 现在我将手柄控制的功能单独拿出来做了一个手柄检测的小程序 供开发者们拿去移植到自己的项目中用 这个程序是用 Qt creator5 12开发环境开发的 不过移植到VS
  • idea配置hibernate环境-零基础入门-详细版

    idea配置hibernate环境 下载hibernate所需jar包 官网链接 高速链接 用idea创建一个web项目 Create New Project gt 选择Java Enterprise gt 勾选Web Applicatio
  • 嵌入式毕设分享 STM32与wifi的天气预报网时钟系统

    文章目录 0 前言 1 设计内容 2 软件设计 3 关键代码 4 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老
  • 基于FPGA的正弦波发生器设计与实现

    基于FPGA的正弦波发生器设计与实现 摘要 本文介绍了一种基于FPGA的正弦波发生器的设计与实现 通过使用FPGA的数字信号处理功能 可以实现高精度 高性能的正弦波生成 文章首先介绍了DDS Direct Digital Synthesis
  • 《如何为Android Studio安装HAXM》

    Preface 1 Intel HAXM Hardware Accelerated Execution Manager 即英特尔硬件加速执行管理器 Intel HAXM 是一款硬件辅助虚拟引擎 管理程序 使用基于 Intel R Virtu
  • Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

    背景 最近在使用JavaScript编写一些浏览器RPA脚本 脚本使用过程中遇到一些问题 脚本使用的数据往往存放在excel表 但运行时只能读取json数据 导致频繁人工excel转json 效率低下 遇到问题后赶紧搜索excel转json
  • Selenium+Webdriver被检测识别出来的应对方案

    在写爬虫 面对很多js 加载的页面 很多人束手无策 更多的人喜欢用Senlenium Webdriver 古语有云 道高一尺魔高一丈 已淘宝为首 众多网站都针对 Selenium的js监测机制 比如 window navigator web
  • 转载:python 文件读写(追加、覆盖)

    with open file txt w as f f write content content 要放入文件的内容 要进行utf 8转码 可在pycharm中打开文件进行转码 x 创建一个新文件并打开它进行写入 b 二进制模式 t 文本模
  • 汇总下关于安全的13款必备工具

    汇总下关于安全的几款必备工具 1 burpsuite Burp Suite 是用于攻击web 应用程序的集成平台 http协议分析神器 里面包括了不少安全必备的功能 重放 爆破 扫描并且支持自定义脚本 实现自己想要的功能 Burp Suit
  • MacBook Big Sur 完美解决外接显示器 字体模糊、边缘不清 HIDPI 解决办法

    该文章转发MacBook Big Sur 完美解决外接显示器 字体模糊 边缘不清 HIDPI 解决办法 毕扬博客
  • error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive]

    include