我是靠谱客的博主 迷你眼睛,最近开发中收集的这篇文章主要介绍error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive],觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#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函数

最后

以上就是迷你眼睛为你收集整理的error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive]的全部内容,希望文章能够帮你解决error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive]所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部