我认为通过将第一个元素设置为null会清除char数组的全部内容。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
但是,这只会将第一个元素设置为null。
要么
my_custom_data[0] = 0;
而不是使用memset
,我认为上述2个示例应清除所有数据。
我认为通过将第一个元素设置为null会清除char数组的全部内容。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
但是,这只会将第一个元素设置为null。
要么
my_custom_data[0] = 0;
而不是使用memset
,我认为上述2个示例应清除所有数据。
Answers:
这取决于您如何查看阵列。如果将数组视为一系列字符,则清除数据的唯一方法是触摸每个条目。memset
可能是实现此目标的最有效方法。
另一方面,如果您选择将其视为C / C ++空终止的字符串,则将第一个字节设置为0将有效清除该字符串。
C语言中的数组只是一个内存位置,因此,实际上,您的my_custom_data[0] = '\0';
分配只是将第一个元素设置为零,而其他元素则保持不变。
如果要清除数组中的所有元素,则必须访问每个元素。那memset
是为了:
memset(&arr[0], 0, sizeof(arr));
通常,这是解决此问题的最快方法。如果可以使用C ++,请考虑使用std :: fill代替:
char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);
您为什么认为设置单个元素会清除整个数组?特别是在C语言中,如果没有程序员对其进行显式编程,几乎不会发生任何事情。如果将第一个元素设置为零(或任何值),则说明您已经做到了,仅此而已。
初始化时,可以将数组设置为零:
char mcd[40] = {0}; /* sets the whole array */
否则,除了memset或类似的东西,我不知道其他任何技术。
用:
memset(my_custom_data, 0, sizeof(my_custom_data));
要么:
memset(my_custom_data, 0, strlen(my_custom_data));
memset(my_custom_data, 0, strlen(my_custom_data));
)仅清除到第一个'\ 0',该值可能超出数组末尾。这可能会也可能不会。
为什么不使用memset()
?就是这样。
设置第一个元素将使其余的内存保持不变,但是str函数会将数据视为空。
请在下面找到我在案例1和案例2之后用数组中的数据解释的位置。
char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );
情况1:
sc_ArrData[0] = '\0';
结果:
- "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''
情况2:
memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));
结果:
- "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''
尽管将第一个参数设置为NULL可以解决问题,但建议使用memset
不。您要做的只是将第一个值设置为“ \ 0”或0。
如果使用空终止字符串,则在第一个示例中,您将获得模仿您期望的行为,但是仍然设置了内存。
如果要在不使用内存集的情况下清除内存,请使用for循环。
您应该使用memset。仅设置第一个元素将不起作用,您需要设置所有元素-否则,如何将第一个元素设置为0?
我通常只是这样做:
memset(bufferar, '\0', sizeof(bufferar));
我认为通过将第一个元素设置为null可以清除char数组的全部内容。
你发现那是不正确的
但是,这只会将第一个元素设置为null。
究竟!
您需要使用memset清除所有数据,仅将其中一项设置为null是不够的。
但是,如果将数组的元素设置为null意味着特殊的事情(例如,当使用null终止字符串时),将第一个元素设置为null可能就足够了。这样,即使该数组仍在内存中包含旧字符,该数组的任何用户仍将理解它为空
将第一个元素设置为NULL。打印char数组将不会给您任何回报。
void clearArray (char *input[]){
*input = ' ';
}