如何解决如何使静态数组指向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*/
解决方法
struct_x defaultStructX[6];
struct_x requiredStructX [6];
使用上述语句,您已为两个结构体数组保留了内存。该内存将在程序的整个生命周期中一直分配给您,并且在程序退出之前无法取消分配。
但是,您要在此存储器中存储的内容完全在您的控制之下。您对“从内存中清除”的定义是什么?
您是否有一些要从内存中删除的敏感数据?您始终可以使用以下方法将它们memset设置为零(或任何其他值):
memset(defaultStructX,0x00,sizeof(defaultStructX));
您要物理地取消分配内存吗?如果要控制内存块的分配和释放,则应使用malloc和free。
编辑:显然,memset()解决方案可以为derailed by compiler optimizations。 Here是SEI CERT C页面上有关此问题的有用描述。
,由于无法删除数组并且要清理内存,是否有可能使静态的静态数组指向NULL?
不。数组既不是指针,也不是特定数组指针的元素。指针值既不能分配给数组本身也不能分配给元素,尤其是不能NULL
分配给它们。
您可以用例如
覆盖阵列所占用的内存memset(defaultStructX,sizeof(defaultStructX));
它将替换先前存储在其中的数据, * ,如果这些数据是敏感的,则可能会有用。然后,应用程序将需要为数组元素分配新的有效值,然后再次使用它们。
但是,无论如何,您都无法释放具有静态存储持续时间的对象的内存,该对象是在文件作用域,所有函数之外或函数内部的static
限定符下声明的任何对象。静态存储持续时间的整个点是使对象的生命周期等于程序运行的整个持续时间。如果您希望能够释放内存,则应该为阵列动态分配空间,或者,如果它适用于您的特定应用程序,则可以自动分配空间(作为精选函数的局部变量)。
* 原则上。正如@chux在评论中指出的那样,编译器可能会选择优化这种覆盖,如果它可以确定从未读取过清零的数据,则可能会这样做。如果这是一个问题,那么最好的缓解方法可能是声明数组volatile
。
您无法手动取消分配未用malloc
,calloc
或realloc
分配的任何内容。如果您在文件作用域(任何函数之外)或使用static
关键字声明了数组,则在程序终止之前不会释放它们的内存。否则,当声明它们的函数退出时,它们的内存将被释放。
您可以用零或其他一些“非值”值覆盖当前未使用的元素,但是无法释放它们所占用的内存。
数组不是指针。数组类型的 Expression 会根据需要转换为指针,但是数组对象本身不是指针。
,由于无法删除数组并且要清除内存,是否有可能使静态结构的数组指向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___,sizeof(defaultStructX___));
memset(defaultStructX___,sizeof(requiredStructX___));
这并不适合您的用例,但这是一种足够好的技术,其他人可能想知道。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。