2010-09-30 99 views
3
char x [1000]; 
x = 'hello'; 
..... 
clear contents of x??? 

我会用什么来清除x?我无法重新初始化它,请使用strcpy(x,'/ 0')或free()。C清除变量

+1

只要对象存在,它就有一个值。您的'x'将在它定义的块的末尾不再存在。 – pmg 2010-09-30 13:55:54

+0

一个快速而脏的方法是将'\ 0'分配给第一个位置:'x [0] ='\ 0';'。大多数字符串函数依赖'\ 0'来终止字符串,而不管数组或内存的长度。 – 2010-09-30 17:42:11

+0

确保你知道双引号(“)和单引号(')之间的区别。它在C中有很大的区别! – abelenky 2010-09-30 20:11:06

回答

5

free()的使用将是错误的,因为x在堆栈中。

你是什么意思?将它设置为默认值?你能用memset吗? (我正在复制您的代码)

#define CLEAR(x) memset(x,'\0',1000) 

char x[1000]; 

x= 'hello'; 

CLEAR(x) 

如果不是,您可以随时使用for循环。

+0

非常感谢汤姆,memset做到了这个把戏:) – Kay 2010-09-30 13:59:34

0

如果通过“清除”您的意思是“清除阵列中的所有位”,那么memset(x, '\0', 1000);

2
x='hello'; 

可能不会做你期待什么,因为'表示一个字符常量(或在这种情况下,一个多字符常量)的字符串。

事实上,GCC将不接受上述代码中,抱怨'hello'是长(这是用4字节int秒的机器上),并且x = 'hell'是不兼容的分配,因为char[]是不一样的int

也不应该

char x[1000]; 
x="hello"; 

工作,因为你不能指定数组的方式。

7

您不能将任何内容分配给您的变量x所在的数组。因此,以x =开头的任何内容都是错误的。其次'hello'不是字符串,它是int类型的多字符文字,所以这也没有意义。字符串文字被"包围,而字符(或多字符)文字被'包围。

所以,如果你想用字符串来填补你的缓冲区x“你好”您使用strncpy或者如果有更好的strlcpy

strncpy(x, "hello", sizeof(x)); 
strlcpy(x, "hello", sizeof(x)); 

strlcpy功能更好,因为它总是终止与nul字符串字符。

如果你想清除它,你可以做其他答案建议。我建议使用strncpystrlcpy,并使用空字符串作为@codaddict建议。这是最明显的代码,“嘿,我想清除那个字符串”。如果要从内存中删除整个字符串内容(例如,如果它包含密码或类似的内容),请使用memset作为@Ken和@Tom建议的内容。

另外请注意,你永远使用功能,如strcpystrcat不接受输出缓冲区作为参数的大小。这些实际上并不安全,并导致令人讨厌的错误和安全漏洞。如果你知道没有什么可以出错的话,甚至不要使用它们,只要养成使用安全功能的习惯。

+0

如果你太笨了, 'strcpy'(我们大多数人大多数时间都是这样),不要使用'strlcpy'或'strncpy',你仍然会搞砸,要么是因为你传递了一些大小不正确的缓冲区,或者因为你的程序将无法正确计算字符串截断,或者两者都不能正确计算,而是使用第三方字符串库,或者更好的是使用不同的语言 – 2010-09-30 14:54:36

+0

@Steve:没有正确的方法来使用'strcpy',但是'strncpy',尤其是'strlcpy'都可以,如果有人甚至无法通过正确的缓冲区大小,他们就不应该编程,剩下的唯一问题就是'strncpy'离开'nul'终结符如果缓冲区没有足够的空间,这就是为什么我推荐'st rlcpy'总是添加ternimator。诚然,这些可能会截断字符串,但与缓冲区溢出相比,这根本不是问题。使用第三方字符串库是一个好主意,但仍然应该了解普通C字符串的问题。 – Sven 2010-09-30 17:18:06

+0

“没有正确的方式来使用strcpy” - 是的,有。你需要知道两个数字,那个数字比另一个大。同时,假设字符串截断不会导致问题,可能包括严重的安全问题,这与使用'strcpy'当你不知道如何正确执行时一样不负责任。一个简单的例子:由于严重的安全问题需要使用身份验证或权限,您需要检查字符串A是否是字符串B的前缀,但是在构建字符串A的过程中是否会截断它?这与缓冲区溢出一样是潜在的拥有权。 – 2010-09-30 21:55:19