我写了两个函数。一个用于复制
char
类型的数组:
void char_arr_copy(const char *src, char *dst, int arr_size)
{
int i;
for (i=arr_size-1; i >= 0; src++, dst++, i--)
*dst = *src;
}
另一个用于复制
char
地址数组:
void word_arr_copy(const char **src, char **dst, int arr_size)
{
int i;
for (i=arr_size-1; i >= 0; src++, dst++, i--)
*dst = *src;
}
我认为,在函数头中向未来的程序读者展示该函数不会更改其操作的某些地址的内容是一件很重要的事情。
虽然第一个函数编译良好,但编译第二个函数会导致以下警告:
revert_str_input_arr2.c:30:14: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
30 | *dst = *src;
| ^
revert_str_input_arr2.c: In function ‘create_new_word’:
revert_str_input_arr2.c:44:23: warning: passing argument 1 of ‘word_arr_copy’ from incompatible pointer type [-Wincompatible-pointer-types]
44 | word_arr_copy(*word_arr_ptr, tmp, word_arr_size-1);
| ^~~~~~~~~~~~~
| |
| word {aka char **}
revert_str_input_arr2.c:26:33: note: expected ‘const char **’ but argument is of type ‘word’ {aka ‘char **’}
26 | void word_arr_copy(const char **src, char **dst, int arr_size)
| ~~~~~~~~~~~~~^~~
据我所知,不能将
const address
和address
等同起来,这是我所有警告的来源。遗憾的是,因为我可以在第一个函数中使用 const char
和 char
执行完全相同的操作。
所以解决这个问题的唯一方法是省略
const
标识符,对吗?
所以事实证明,我可以(向潜在的未来程序读者)表明我不会仅在我的一个功能中更改
src
内容,而在另一个功能中我无法以任何方式做到这一点?
你的意思可能是
void word_arr_copy(const char *const *src, const char **dst, int arr_size)
或
void word_arr_copy(char *const *src, char **dst, int arr_size)
(取决于元素是否分别指向常量字符或可变字符)。
顺便说一句,我建议先写
dst
,这样它看起来就像标准函数,例如 memcpy()
(它本身通过与 =
运算符类比将目的地放在第一位)。这将有助于减少用户的困惑。对于尺寸参数,更喜欢 size_t
。