我有一个大小为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
的内存中完全清除此数组?
答案 0 :(得分:3)
sizeof(arr)
的大小为三char*
。将每个指针设置为0
时,它不会改变。
如何从sizeof(arr)的内存中完全清除此数组 给0?
没有办法“清除”自动存储分配的数组。你根本不需要“清除”它。
请注意,您应使用%zu
打印size_t
值,这是sizeof
运算符产生的值。使用不正确的格式说明符是undefined behaviour。
答案 1 :(得分:2)
不,不,不。这里有几个不同的问题:
如果要清除内存块,请使用memset()
如果您想将字符串清零,您只需将FIRST字符设置为空:arr[0] = 0;
sizeof operator会告诉您阵列的大小。
strnlen()会告诉您字符串的长度。
即使您为数组分配了3个字节,字符串的实际长度也可能是0,1或2.
永远不会是&#34; 3&#34; ...因为终结器至少需要一个字节。
答案 2 :(得分:1)
您已为阵列分配了零,但这就是全部。你没有改变(并且不能,因为你没有malloc()
它)分配给数组的内存量,只清除了它内部的数据。
答案 3 :(得分:1)
如何从
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);
答案 4 :(得分:1)
char * arr [3] = {&#34; CERN&#34;,&#34; 0&#34;,&#34; ALK&#34;};
如何从sizeof(arr)赋予0的内存中完全清除此数组?
这是一个静态分配(自动/全局变量)。分配给 arr 的内存无法清除。
注意:在这种情况下,&#34; CERN&#34;,&#34; 0&#34;,&#34; ALK&#34; 可能存储在只读中细分。
答案 5 :(得分:-1)
你可以看一下这篇文章,因为它解释了静态和动态分配内存之间的区别: