向HDF5文件写入可变长度字符串属性时触发访问冲突
问题排查与解决
你的代码核心问题是可变长度字符串写入HDF5属性时,传入的数据格式不符合要求。
HDF5处理可变长度字符串(H5T_VARIABLE)时,即便只是标量,也要求传入指向字符串指针的指针(const char**),而非直接传字符串的指针(const char*)。你直接传value.c_str()会导致HDF5内部错误地把字符串内容当成指针地址去访问,进而触发访问冲突。
修正后的代码
#include <hdf5.h> #include <string> void writeAttr(hid_t parent, const std::string& name, const std::string& value) { hid_t type = H5Tcopy(H5T_C_S1); H5Tset_size(type, H5T_VARIABLE); // 可选:明确字符集和填充方式,避免跨平台兼容问题 H5Tset_cset(type, H5T_CSET_ASCII); H5Tset_strpad(type, H5T_STR_NULLTERM); hid_t scalar_space = H5Screate(H5S_SCALAR); hid_t attr = H5Acreate(parent, name.c_str(), type, scalar_space, H5P_DEFAULT, H5P_DEFAULT); // 关键:传入字符串指针的地址,匹配可变长度字符串的参数要求 const char* str_ptr = value.c_str(); herr_t status = H5Awrite(attr, type, &str_ptr); H5Aclose(attr); H5Sclose(scalar_space); // 补上之前遗漏的空间句柄关闭,避免资源泄漏 H5Tclose(type); } int main() { const std::string filename = "D:\\test.h5"; hid_t file = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); writeAttr(file, "Attribute", "Attribute value"); H5Fclose(file); return 0; }
补充说明
- 原代码遗漏了关闭
H5Screate创建的标量空间句柄,修正后补上以避免资源泄漏。 - 你之前添加的
H5Tset_cset和H5Tset_strpad本身没有问题,但并非触发访问冲突的原因,核心问题始终是数据指针的传递方式错误。
内容的提问来源于stack exchange,提问作者steveo225
相关产品推荐
相关产品推荐

