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

问题描述 投票:0回答:6

我有这样的数组,大小为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的数组?

c pointers char
6个回答
3
投票

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

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

没有办法“清除”自动存储中分配的阵列。您真的根本不需要“清除”它。

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


2
投票

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

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

  2. 如果要将字符串归零,则只需将FIRST字符设置为null:arr[0] = 0;

  3. sizeof operator告诉您数组的大小。

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

即使您为数组分配了3个字节,字符串的实际长度也可能是0、1或2。

永远不能为“ 3” ...,因为终止符至少需要一个字节。


1
投票

您已将零分配给数组,仅此而已。您尚未更改(并且由于未进行malloc()操作所以无法更改)分配给该数组的内存量,仅清除了其内部的数据。


1
投票

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

无法提供您的声明。

[您必须想出另一种逻辑才能得出0arr中非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);

1
投票

char * arr [3] = {“ CERN”,“ 0”,“ ALK”};

  • 这里arr是3个char指针的数组。每个元素的大小为8字节(在64位系统上)。
  • 所以arr的大小将始终为24(3 * sizeof(void *))] >>,无论指针所引用的内存是什么(即地址或NULL,进一步解释为char或字符串) 。与arr size)无关。
  • 以上for循环
  • 将仅将指针初始化为NULL。

    如何从内存中完全清除该数组,sizeof(arr)将给出0?

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

注意:在这种情况下,“ CERN”,“ 0”,“ ALK”

可能存储在只读段中。

-1
投票

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

热门问题
推荐问题
最新问题