Александр Asked:2022-06-20 02:23:59 +0000 UTC2022-06-20 02:23:59 +0000 UTC 2022-06-20 02:23:59 +0000 UTC lighttpd 源代码行是什么意思?C++ 772 #define BINPATH SBIN_DIR"/lighttpd" int main(int argc, char* argv[]){//argv это char** *(const char **)&argv[0] = BINPATH; } c++ 1 个回答 Voted Best Answer VladimirS 2022-06-20T18:44:17Z2022-06-20T18:44:17Z 据我了解,上下文是这样的: #define BINPATH SBIN_DIR"/lighttpd" // Соединяем строку макроса SBIN_DIR с "/lighttpd", записываем в SBIN_DIR int main(int argc, char* argv[]){//argv это char** *(const char **)&argv[0] = BINPATH; } 解密: argv[0]- 传递给参数的第 0 个字符串 &argv[0]- 它的地址(指向它的指针)。那些。string 是一个指针/字符数组,我们获取字符串的地址 => 我们获取一个指向指针/字符数组的指针 (const char **)&argv[0]- 删除字符串常量(可以尝试使用 const_cast<const char**>(&argv[0]) 代替) *(const char **)&argv[0]- 取消引用指向字符串的指针(指向字符数组/指针的指针),获取 - 字符串(只是字符数组/指针) *(const char **)&argv[0] = BINPATH;- 我们在调用程序时分配给命令行的行参数,另一个字符串(考虑到恒常性 - 因为它与类型转换有一个整体的舞蹈),事实上 - 我们将一个指针等同于一个字符序列与另一个(只需分配地址)。 Nota bene:虽然这(我说的是第五步)在大多数情况下它是有效的,因为 通常,没有人接触程序启动参数,但如果有人这样做,例如,在第 5 步之后这样做argv[0][0] = 'H',那么您可能会遇到未定义的行为:非常量 argv 允许您更改字符串中的任何字符,但是因为 由于我们为它分配了一个常量字符串的地址,因此修改该字符串的尝试可能会产生不可预知的后果。
据我了解,上下文是这样的:
解密:
argv[0]- 传递给参数的第 0 个字符串&argv[0]- 它的地址(指向它的指针)。那些。string 是一个指针/字符数组,我们获取字符串的地址 => 我们获取一个指向指针/字符数组的指针(const char **)&argv[0]- 删除字符串常量(可以尝试使用 const_cast<const char**>(&argv[0]) 代替)*(const char **)&argv[0]- 取消引用指向字符串的指针(指向字符数组/指针的指针),获取 - 字符串(只是字符数组/指针)*(const char **)&argv[0] = BINPATH;- 我们在调用程序时分配给命令行的行参数,另一个字符串(考虑到恒常性 - 因为它与类型转换有一个整体的舞蹈),事实上 - 我们将一个指针等同于一个字符序列与另一个(只需分配地址)。Nota bene:虽然这(我说的是第五步)在大多数情况下它是有效的,因为 通常,没有人接触程序启动参数,但如果有人这样做,例如,在第 5 步之后这样做
argv[0][0] = 'H',那么您可能会遇到未定义的行为:非常量 argv 允许您更改字符串中的任何字符,但是因为 由于我们为它分配了一个常量字符串的地址,因此修改该字符串的尝试可能会产生不可预知的后果。