//函数的开始:
char *encrypt(char *string, size_t length) {
}
我正在开始一个简单的加密函数,我想知道上面的代码到底在执行什么?我假设我正在将加密函数初始化为字符指针,内存目标为“字符串”,大小为“长度”
我说得对吗?
最佳答案
片段
char *encrypt(char *string, size_t length) {
}
定义一个名为encrypt
的函数,它接受一个char *
和一个size_t
作为参数,并返回一个char *
。正如所写,函数体是空的,并且将触发至少一个诊断,因为它没有返回值。
看起来它的意思是采用未加密的字符串作为string
参数,并返回它的加密版本:
char unenc[] = "This is a test";
char *enc = encrypt( unenc, strlen( unenc ) );
我们处理指针是因为 C 处理数组表达式的方式。 字符串是包含 0 值终止符的字符值序列 - 字符串“hello”表示为序列 {'h', 'e', 'l', 'l ', 'o', 0}
。字符串存储在字符类型的数组中(char
用于 ASCII、EBCDIC 和 UTF-8 编码,wchar_t
用于“宽”编码,如 UTF-16)。
但是,除非它是 sizeof
或一元 &
运算符的操作数,或者是用于初始化字符数组的字符串文字在声明中,数组类型的表达式被转换(“衰减”)为指针类型的表达式,表达式的值是数组第一个元素的地址。
我们将 unenc
定义为一个 char
数组,其大小足以容纳字符串 “This is a test”
(14 个字符加上 0终结者)。当我们将 unenc
作为参数传递给 encrypt
时,它会从 char [15]
类型“衰减”为 char *
>,函数实际接收的是数组第一个元素的地址(&unenc[0]
)。
数组表达式不能作为赋值的目标,并且函数不能返回数组类型。然而,加密
是在内部工作的,它不能将加密的字符串作为数组返回;它只能返回指向存储字符串的数组的第一个元素的指针。
现在,在不知道实现的情况下,加密
可能会就地加密字符串,覆盖数组的原始内容,并返回相同的地址:
char *encrypt( char *string, size_t length )
{
for ( size_t i = 0; i < length; i++ )
string[i] = replace_char( string[i] );
return string;
}
由于 string
被声明为 char *
而不是 const char *
,因此这是一个合理的推断。而且它可以避免内存管理的麻烦。当然,你会破坏你的输入,所以需要权衡。
如果没有就地加密,则 encrypt
函数需要分配新内存,或使用函数生命周期之外可用的内存(全局或已声明的局部内存static
,这带来了自己的麻烦):
char *encrypt( char *string, size_t length )
{
char *e = malloc( length + 1 );
if ( e )
{
for ( size_t i = 0; i < length; i++ )
e[i] = replace_char( string[i] );
}
return e;
}
关于c - 我刚刚开始学习C : Can someone explain what the pointers and typecasting are doing in this code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60210610/