关于结构的快速问题:
struct xint {
int number;
char string[12];
};
int main(int argc, char *argv[])
{
struct xint offsets, *poffsets;
poffsets=&offsets;
FILE * pFile = fopen("file","rb");
fread(poffsets,1,16,pFile);
printf("Number %d\nString %s\n",offsets.number,offsets.string);
}
我得到了这个输出
Number 12345
Segmentation fault
我知道我可能在结构,指针和内存分配方面做错了。在此先感谢:)
答案 0 :(得分:2)
您的问题是您是直接从文件读取结构,而不检查结构对齐。这样做:
fread(&offset.number,1,sizeof(offsets.number),pFile);
fread(&offset.string,1,sizeof(offsets.string),pFile);
答案 1 :(得分:1)
我怀疑您正在阅读的文件数据不会终止带有NUL
('\0'
)字符的字符串。通过C标准库的printf()
所遵循的字符串的C定义,字符串必须以NUL
字符终止。
您可能总是(通过代码)确保.string[11] = '\0'
。
或,声明string[13]
并确保string[12] = '\0'
另外,另一张海报提到了结构成员对齐问题。这是您必须解决的有效问题。
答案 2 :(得分:0)
你得到缓冲区溢出。您的字符串包含12个字符,但您没有空格来终止'\0'
。
如果你这样做了:
struct xint {
int number;
char string[16]; // Make sure you have enough space for the string + '\0'.
};
int main(int argc, char *argv[])
{
struct xint offsets, *poffsets;
// Initialize your memory to 0. This will ensure your string is
// '\0'-terminated.
// FYI, sizeof(xint) here is 20.
memset(&offsets, 0, sizeof(xint));
poffsets=&offsets;
FILE * pFile = fopen("file","rb");
fread(poffsets,1,16,pFile);
printf("Number %d\nString %s\n",offsets.number,offsets.string);
}
这样可以解决问题。
答案 3 :(得分:0)
我猜这个字符串在文件中没有以null结尾,你的代码也没有做任何事情来终止字符串。
fread(poffsets, 1, 16, pFile);
offsets.string[11] = '\0';
printf("Number %d\nString %s\n", offsets.number, offsets.string);
或者修改文件,使字符串以空字节结束。