c-如何使静态数组指向NULL



由于我不能删除数组,并且我想清理内存,有没有可能的方法使结构的静态数组指向NULL?

假设我们有以下代码:

struct_x defaultStructX[6];
struct_x requiredStructX [6];
gettingDefaultX(defaultStructX, 6);         
for (uint8_t i = 0; i <6; i++)
{
setStructX(requiredStructX[i].index, requiredStructX[i].icirate, requiredStructX[i].icis, requiredStructX[i].iei);
//error handle case
if (status == STATUS_SUCCESS)
{
writeResponse.writeStatus = status_ok; /*This is another struct not important at this point*/
} else
{
errorHandleQciFlowMeter(defaultStructX, 6);
writeResponse.writeStatus = status_nok; 
break;
}
}
/*here I want to write code line to clean the defaultStructX from memory. Is it possible? I have tried *defaultStructX[i]= NULL and ##((void*)defaultQciFlowMeter) = NULL; ## and many other methods but it didn't work*/

由于我不能删除数组,并且我想清理内存,有没有可能的方法让静态数组指向NULL?

否。数组不是指针,特定数组的元素也不是指针。指针值既不能分配给数组本身,也不能分配给元素,尤其是NULL不能分配给它们。

你可以用覆盖数组占用的内存

memset(defaultStructX, 0, sizeof(defaultStructX));

这将替换以前存储在*中的数据,如果这些数据是敏感的,这可能会很有用。然后,应用程序需要为数组元素分配新的有效值,然后才能再次使用它们。

但是,无论如何,都不能释放具有静态存储持续时间的对象的内存,该对象是在文件范围内、所有函数外或函数内具有static限定符声明的任何对象。静态存储持续时间的整个点是对象的生存期是程序运行的整个持续时间。如果你想释放内存,那么你应该动态地为数组分配空间,或者,如果它适用于你的特定应用程序,则自动地(作为一个精心选择的函数的局部变量)。


*原则上。正如@chux在评论中指出的那样,编译器可能会选择优化这种覆盖,如果它能够确定从未读取过清零的数据,它可能会这样做。如果这是一个问题,那么最好的缓解措施可能是声明数组volatile

struct_x defaultStructX[6];
struct_x requiredStructX [6];

通过上面的语句,您已经为这两个结构数组保留了内存。在程序的整个生命周期中,此内存将一直分配给您,并且在程序退出之前无法取消分配。

然而,你想存储在这个内存中的内容完全在你的控制之下。你对"清除内存"的定义是什么?

你有一些敏感数据要从内存中擦除吗?您可以始终使用将它们memset为零(或任何其他值)

memset(defaultStructX, 0x00, sizeof(defaultStructX));

是否要物理取消分配内存?如果您想控制内存块的分配和释放,那么应该使用malloc和free。

EDIT:显然,memset()解决方案可能会因编译器优化而脱轨。以下是SEI CERT C页面上对这个问题的有用描述。

您无法手动解除分配任何未分配给malloccallocrealloc的内容。如果您在文件范围(任何函数之外)或使用static关键字声明数组,那么在程序终止之前,它们的内存不会被释放。否则,当声明它们的函数退出时,它们的内存将被释放。

您可以用零或其他"非值"值覆盖当前未使用的元素,但不能释放它们占用的内存。

数组不是指针数组类型的表达式会根据需要转换为指针,但数组对象本身不是指针。

由于我不能删除数组,并且我想清理内存,有没有可能的方法使结构的静态数组指向NULL?

否。数组不指向。可以清除该数组。

我想写一行代码来从内存中清除defaultStructX。

只需为其分配零。

如果编译器发现数据随后没有被读取,memset()可以得到优化。

备选方案:使用带有指向易失性数据的指针的循环,以避免循环被优化掉。

volatile unsigned char *vp = defaultStructX;
for (size_t i = 0; i<sizeof defaultStructX; i++ {
vp[i] = 0;
}

嗯。。。一方面,我喜欢John Bollinger提供的详细答案,我相信他为您的用例给出了正确的答案。。。然而

有一种方法可以使静态分配的数组看起来指向NULL。

显然,不能将NULL分配给数组。然而,您可以使一个静态分配的";数组">似乎通过将NULL隐藏在指针后面来指向它。

它可能看起来像这样:

#define STRUCT_X_ARRAY_LENGTH 6
struct_x defaultStructX___[STRUCT_X_ARRAY_LENGTH];
struct_x requiredStructX___[STRUCT_X_ARRAY_LENGTH];
struct_x * defaultStructX = defaultStructX___;
struct_x * requiredStructX = requiredStructX___;
gettingDefaultX(defaultStructX, STRUCT_X_ARRAY_LENGTH);         

现在你可以设置(不再)";数组";至NULL,使用:

defaultStructX = NULL;
requiredStructX = NULL;

您也可以使用重置状态(清空内存并重新分配正确的内存地址)

defaultStructX = defaultStructX___;
requiredStructX = requiredStructX___;
memset(defaultStructX___, 0 , sizeof(defaultStructX___));
memset(defaultStructX___, 0 , sizeof(requiredStructX___));

这并不适合你的用例,但这是一种足够好的技术,其他人可能想知道它

相关内容

  • 没有找到相关文章

最新更新