我有这样的数组,大小为24 byte
:
char* arr[3] = {"CERN", "0", "ALK"};
printf("%ld\n", sizeof(arr));
然后我尝试通过将\0
分配给数组的每个元素来从内存中清除该数组:
for (size_t i = 0; i < sizeof(arr)/ sizeof(char*); ++i) {
arr[i] = '\0';
}
但是当我想检查数组的大小时,它仍然给我24 byte
:
printf("%ld\n", sizeof(arr));
> 24
如何从内存中完全清除sizeof(arr)
会给0
的数组?
sizeof(arr)
是三个char*
的大小。将每个指针设置为0
时,它不会改变。
如何从内存中完全清除此数组,而sizeof(arr)将 给0?
没有办法“清除”自动存储中分配的阵列。您真的根本不需要“清除”它。
注意,您应该使用%zu
打印size_t
值,这是sizeof
运算符产生的值。使用错误的格式说明符是undefined behaviour。
不,不,不。这里有几个不同的问题:
如果要清除内存块,请使用memset()
如果要将字符串归零,则只需将FIRST字符设置为null:arr[0] = 0;
sizeof operator告诉您数组的大小。
strnlen()告诉您字符串的长度。
即使您为数组分配了3个字节,字符串的实际长度也可能是0、1或2。
永远不能为“ 3” ...,因为终止符至少需要一个字节。
您已将零分配给数组,仅此而已。您尚未更改(并且由于未进行malloc()
操作所以无法更改)分配给该数组的内存量,仅清除了其内部的数据。
如何从内存中完全清除
sizeof(arr)
会给0
的数组?
无法提供您的声明。
[您必须想出另一种逻辑才能得出0
– arr
中非NULL的项目数。
int my_own_array_size(char* arr[], int numElements)
{
int count = 0;
for ( int i = 0; i < numElements; ++i )
{
if ( arr[i] != NULL )
++count;
}
return count;
}
然后将其用作:
int count = my_own_array_size(arr, 3);
char * arr [3] = {“ CERN”,“ 0”,“ ALK”};
如何从内存中完全清除该数组,sizeof(arr)将给出0?
这是静态分配(自动/全局变量)。为arr分配的内存无法清除。
注意:在这种情况下,“ CERN”,“ 0”,“ ALK”
可能存储在只读段中。[您可以看一下这篇文章,因为它解释了静态和动态分配的内存之间的区别: