如何清除char *的内存数组?

时间:2016-08-05 06:20:19

标签: c pointers char clear

我有一个大小为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的内存中完全清除此数组?

6 个答案:

答案 0 :(得分:3)

sizeof(arr)的大小为三char*。将每个指针设置为0时,它不会改变。

  

如何从sizeof(arr)的内存中完全清除此数组   给0?

没有办法“清除”自动存储分配的数组。你根本不需要“清除”它。

请注意,您应使用%zu打印size_t值,这是sizeof运算符产生的值。使用不正确的格式说明符是undefined behaviour

答案 1 :(得分:2)

不,不,不。这里有几个不同的问题:

  1. 如果要清除内存块,请使用memset()

  2. 如果您想将字符串清零,您只需将FIRST字符设置为空:arr[0] = 0;

  3. sizeof operator会告诉您阵列的大小。

  4. strnlen()会告诉您字符串的长度。

  5. 即使您为数组分配了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;};

  • 此处 arr 是一个包含3个字符指针的数组。每个元素的大小为8个字节(在64位系统上)。
  • 所以 arr 的大小始终为 24(3 * sizeof(void *)),而不管指针引用的内存(即地址或NULL,进一步解释为char或string。这与 arr 大小无关)
  • for循环以上只会将指针初始化为NULL。
  

如何从sizeof(arr)赋予0的内存中完全清除此数组?

这是一个静态分配(自动/全局变量)。分配给 arr 的内存无法清除。

注意:在这种情况下,&#34; CERN&#34;,&#34; 0&#34;,&#34; ALK&#34; 可能存储在只读中细分。

答案 5 :(得分:-1)

你可以看一下这篇文章,因为它解释了静态和动态分配内存之间的区别:

What and where are the stack and heap?