c - strtol、strtod 不安全吗?

标签 c constants std c-strings const-char

似乎 strtol()strtod() 有效地允许(并强制)您放弃字符串中的常量:

#include <stdlib.h>
#include <stdio.h>

int main() {
  const char *foo = "Hello, world!";
  char *bar;
  strtol(foo, &bar, 10); // or strtod(foo, &bar);
  printf("%d\n", foo == bar); // prints "1"! they're equal
  *bar = 'X'; // segmentation fault
  return 0;
}

以上,我自己没有做任何类型转换。但是,strtol() 基本上将我的 const char * 转换为 char * ,没有任何警告或任何东西。 (事实上​​,它不允许您将 bar 键入为 const char *,因此会强制进行不安全的类型更改。)这真的很危险吗?

最佳答案

我猜是因为替代方案更糟糕。假设原型(prototype)被更改为添加 const:

long int strtol(const char *nptr, const char **endptr, int base);

现在,假设我们要解析一个非常量字符串:

char str[] = "12345xyz";  // non-const
char *endptr;
lont result = strtol(str, &endptr, 10);
*endptr = '_';
printf("%s\n", str);  // expected output: 12345_yz

但是当我们尝试编译这段代码时会发生什么?编译错误!这相当不直观,但您不能将 char ** 隐式转换为 const char **。查看C++ FAQ Lite详细解释原因。从技术上讲,那里讨论的是 C++,但参数对 C 也同样有效。在 C/C++ 中,您只能将“指向 类型 的指针”隐式转换为“指向 const 的指针” type"在最高级别:您可以执行的转换是从 char **char * const *,或等效从“指向(指向 char 的指针)”到“指向(const 指向 char)的指针”。

因为我猜想解析一个非常量字符串比解析一个常量字符串更有可能,我会继续假设 const-不太可能的情况下的不正确性比使常见情况是编译器错误。

关于c - strtol、strtod 不安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993700/

相关文章:

c - 在什么情况下 C 需要指向指针的指针?

C 字符数组实现

char - Const Char* test() return String.c_Str() 无法正常工作

c++ - 为什么即使 T 的 value_type 是 const,std::is_const::value 也是 'false'?

c++ - 使用 Visual C++ 形式读取文件的行为与在 C 程序中读取的行为不同

C:为什么从命令行获取字符串比在程序中设置字符串更容易被识别?

c++ - 连接 const char* C++

c++ - 日志记录,如何获得命令结束?

c++ - 为什么在全局范围和命名空间 std 中都定义了 size_t?

c++ - std::map 使用大量内存