关于网友提出的“ 注册表枚举问题,枚举子注册项下的值存入数组全相同”问题疑问,本网通过在网上对“ 注册表枚举问题,枚举子注册项下的值存入数组全相同”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 注册表枚举问题,枚举子注册项下的值存入数组全相同描述:
注册表指针枚举
好像是指针问题纠结几天了我先用 RegEnumKeyEx 枚举出指定注册项下的 子注册项
然后再用 RegOpenKeyEx 打开获取到的子注册项
最后用 RegQueryValueEx 获取指定的值
我用一个 TCHAR 指针数组接受获取到的值
例如:TCHAR *retVal[MAX_PATH]{};
RegQueryValueEx 获得的值存入 TCHAR tcData[MAX_VALUE_NAME] = _T("");
我在循环里写了 retVal[i] = tcData;
接着我调试,逐行运行,tcData 成功获取到了值
retVal[i] = tcData;也成功的把第一个值存入了 retVal[0]
存入后我有写RegCloseKey
问题出现在循环第二次的时候,执行完 RegQueryValueEx,就把 retVal[0] 的值变成了 retVal[1] 的值了
到下一行执行 retVal[i] = tcData; 的时候,retVal[0] 和 retVal[1] 值是一样的了,都成了 retVal[1] 的值
最后我发现和 tcData 有关,如果我在 retVal[i] = tcData; 后加上一句 tcData[0] = NULL;
那么 retVal[0] 的值就变成空的了,但是有内存地址,是不是传址造成的,求大神……
解决方案1:
固定分配,你只能预先分配指定个数和指定长度的二位数组,像#6赵忠的那样。动态分配内存,可以根据需要给指针数组的每个元素分配一个指针,不会浪费,但有多少个元素就要分配多少次,对应的释放也要释放多少次。动态分配内存,也可以一次性分配指定元素个数×最大元素长度个字节,这样会出现很多浪费,而释放只需要一次。
解决方案2: #define MAX_ITEMS 1000
#define MAX_VALUE_LEN 1024
TCHAR tcData[MAX_ITEMS][MAX_VALUE_LEN];