我正在使用fstream读取二进制文件并将信息存储在一个字符数组中:
int dataLength = 32;
int counter = 0;
char data[dataLength];
char PMTone[dataLength/4];
std::fstream *fs = new std::fstream(inputFileName,std::ios::in|std::ios::binary);
fs->read((char *)&data, dataLength);
//of the 32 characters in data[], I need first, 5th etc elements:
//fill first pmt info
for(int i=0; i<(dataLength/4); i++){
PMTone[i]=data[counter];
counter+=4;
}
现在我将PMTone [7]设置为测试:
PMTone[7] = "a";
我收到错误:
mdfTree.cpp:92:21:错误:从'const char *'无效转换为 'char'[-fpermissive]
我不明白为什么当PMTone []被定义为字符数组时,PMTone []中的元素是指向字符的指针。
当我将PMTone []视为指向字符的指针数组时:
(*PMTone)[7] = "a";
我得到另一个我不理解的错误:
mdfTree.cpp:91:18:错误:数组的类型'char [int]'无效 下标
这似乎意味着编译器根本不认为PMTone []是一个数组,而只是一个指向char的指针。
任何人都可以了解这里发生的事情吗?为什么PMTone []成为指向字符的指针数组?
答案 0 :(得分:2)
文字"a"
不是字符。
你需要:
PMTone[7] = 'a';
答案 1 :(得分:1)
"a"
不是字符,它是一个字符数组,'a'后跟一个空终止符。
你需要
PMTone[7] = 'a';
单引号顺便说一句,我很惊讶它早先编译,因为dataLength没有被声明为const。
PMTone
本身属于char[8]
类型,它是一个字符数组。然而,它衰减到一个指针,而(*PMTone)
是char
答案 2 :(得分:0)
数组是一种通过获取第一个元素的地址并通过索引访问其他元素来存储值的方法。 数组基本上是指向第一个元素的指针。
创建chars
char arr[n];
程序实际上为内存中的n个字符创建了空间。
访问arr[0]
时,让我们这样说:
arr[2] = 'a';
程序实际上是这样做的:
*(arr + 2) = 'a';
意味着您正在访问一个字符,该字符比数组中第一个元素的内存位置(因此,arr + 2
)更远地存储2个字节,第一个元素是arr[0]
。
第一个元素的地址是&(arr[0])
或arr
。两者都是相同的值。
该错误是您尝试将字符串"a"
保存到char
。
问题是您尝试通过取消引用解除引用的指针来修复它:
(*PMTone)[7] = "a"; // is the same as
(PMTone[0])[7] = "a"; // when it should be
PMTone[7] = 'a';