-1

我正在使用 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] 设置为 a 作为测试:

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[] 变成了一个指向字符的指针数组?

4

3 回答 3

2

字面"a"量不是字符。

你需要:

PMTone[7] = 'a';
于 2012-10-22T08:56:35.150 回答
1

"a"不是一个字符,它是一个字符数组,'a' 后跟一个空终止符。

你需要

 PMTone[7] = 'a';

带单引号。顺便说一句,我很惊讶它编译得更早,因为 dataLength 没有被声明为 const。

PMTone它本身是char[8]一个字符数组的类型。然而,它衰减为指针并且(*PMTone)是类型的第一个元素char

于 2012-10-22T08:56:36.260 回答
0

数组是一种通过获取第一个元素的地址并通过索引访问其他元素来存储值的方法。数组基本上是指向第一个元素的指针。

当您创建一个数组时chars

char arr[n];

程序实际上在内存中为 n 个字符创建了空间。

访问时arr[0]让我们这样说:

arr[2] = 'a';

程序实际上是这样做的:

*(arr + 2) = 'a';

这意味着您正在访问一个字符,该字符存储在距离数组中第一个元素(因此是 )的内存位置 2 个字节的位置,第arr + 2一个元素是arr[0]. 第一个元素的地址是&(arr[0])or, arr。两者是相同的值。

该错误是您尝试将字符串保存"a"char.

问题是您尝试通过取消引用取消引用的指针来修复它:

(*PMTone)[7] = "a"; // is the same as
(PMTone[0])[7] = "a"; // when it should be 
PMTone[7] = 'a';
于 2015-04-11T21:22:41.957 回答