- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据 Microsoft 文档,API char * strerror(int errnum)
"maps errnum to an error-message string and returns a pointer to thestring"
在实践中发现有一个重要方面未在描述中涵盖:
这是代表这种行为的代码:
printf("---------- print separately [OK] ----------\n");
printf("strerror(1)=(%s), ptr=(%p)\n", strerror(1), strerror(1));
printf("strerror(2)=(%s), ptr=(%p)\n", strerror(2), strerror(2));
printf("---------- print together [BUG] ----------\n");
printf("strerror(1)=(%s), strerror(2)=(%s)\n", strerror(1), strerror(2));
printf("ptr_1=(%p), ptr_2=(%p)\n", strerror(1), strerror(2));
printf("---------- print together, get pointers separately [BUG] ----------\n");
const char * s1 = strerror(1);
const char * s2 = strerror(2);
printf("strerror(1)=(%s), strerror(2)=(%s)\n", s1, s2);
printf("ptr_1=(%p), ptr_2=(%p)\n", s1, s2);
printf("---------- --------------------------- ----------\n");
输出:
---------- print separately [OK] ----------
strerror(1)=(Operation not permitted), ptr=(000002756DE6BD90)
strerror(2)=(No such file or directory), ptr=(000002756DE6BD90)
---------- print together [BUG] ----------
strerror(1)=(Operation not permitted), strerror(2)=(Operation not permitted)
ptr_1=(000002756DE6BD90), ptr_2=(000002756DE6BD90)
---------- print together, get pointers separately [BUG] ----------
strerror(1)=(No such file or directory), strerror(2)=(No such file or directory)
ptr_1=(000002756DE6BD90), ptr_2=(000002756DE6BD90)
---------- --------------------------- ----------
未使用编译器优化标志。相同的代码在带有 gcc 的 Linux 上也能正常工作。
更新:问题已得到解答。
问:这种行为是BUG吗?
问:还有其他更好的 API 可以在 Linux 上用作 strerror 吗?
最佳答案
这不是错误。根据 strerror 的 POSIX 文档:
The returned string pointer might be invalidated or the string content might be overwritten by a subsequent call to
strerror()
因此,如果您在单个语句中调用它两次,则不应期望多个值有效(并且您的代码崩溃或执行其他奇怪的事情是完全可以接受的)。
根本原因可能是因为 Microsoft C 库为 strerror
返回值使用单个固定缓冲区,因此每次调用都会覆盖先前保存的值。这是标准特别允许的,以便于实现。
关于c - 在一个 printf() 中使用 strerror() 两次不同的值会触发 Windows 上的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71680483/
请解释以下程序中发生了什么。 我在程序的开头和结尾检查了 strerror(errno) 返回的地址,并确认它每次都返回相同的地址。然后一旦确定这一点,在第一种情况下我继续将相同的地址分配给 ptr,
我正在尝试创建类似 this 的函数它将打印出与其错误编号相关的错误详细信息,但我收到错误 error: expected initializer before 'strerror'。这是代码 #in
C 函数strerror 返回错误描述字符串,详见here .示例字符串 No such file or directory 问题是这些字符串在哪里定义的?我查看了我的头文件,但没有看到任何东西。 最
我正在将一些代码移植到 Windows,Microsoft 编译器 (Visual C++ 8) 告诉我 strerror() 不安全。 撇开微软提供的所有安全字符串中的烦恼因素不谈,我实际上可以看到
考虑到 fopen() 失败,在下面的代码中: FILE *fp = fopen("file.txt", "w"); if (fp == NULL) { printf("Error occur
有没有strerror -当前内核中的类似功能?我一直没能找到,所以我的想法是没有,但更重要的是,他们有没有讨论过这个问题?我认为它可以减少故障排除时间,因为您不必查找错误代码(不是每个人都记住)并且
我的代码如下: #include #include #include int test(const char *fmt, ...); int main(void) { int i
设置非拉丁语言环境时,IOError.strerror 对我来说在 Python 2.7 中变为非 Unicode: import locale locale.setlocale(locale.LC_
据我了解,strerror(errno)返回对应于 errno 的错误的字符串形式.在这种情况下,我是否需要在使用完函数后释放函数的返回结果? 最佳答案 你不仅不需要;你绝不能 .唯一可以传递给fre
我刚刚浏览了 C99 标准,寻找一些我现在不记得的东西,当我注意到从 strerror() 函数(第 7.12.6.2 节)返回的指针不是t const 限定,即使标准说: The strerror
采用这个简单的程序 #include #include #include int main (void) { printf ("ERROR %d %s\n", ETIMEDOUT, stre
在使用 CRT 函数(如 fopen())后,我可以使用 strerror() 获取 errno 值的文本表示。如果我使用 open() Linux 系统调用而不是 CRT 函数,它也会在失败时设置
在我的代码中的某些地方,我会像这样打印调试消息: int ret = getLinkSpeed(device.getSysName(), linkSpeed); if (ret < 0) {
我尝试过 RTM,但是:给定 ICU UErrorCode ,如何获取相应的错误信息字符串?即,ICU 相当于 strerror(3) . 最佳答案 const char *u_errorName(U
根据 Microsoft 文档,API char * strerror(int errnum) "maps errnum to an error-message string and returns
我正在使用谷歌应用引擎创建一个访问预测 API 的应用程序。当我在网站上更新它时,我能够运行该应用程序,但是我无法在 localhost:8080 上运行它。 我绝对是菜鸟,非常感谢任何帮助。 这是错
我正在使用 Visual Studio 2013 和 ITK 4.3 进行图像分割,但出现错误: \itk4.3.1-64bit\debug\include\itk-4.3\gdcmVR.h(168)
我已经成功cross-compiled the Apache Portable Runtime (APR) for the iPhone ,使用一组 configure scripts使用必要的交叉编
我尝试通过 native 方法访问 android 中的文件,但在调用读取或写入函数后出现“无效参数”。 data_ptr 对齐到 512 字节,它在 java 中声明为字节数组。 JNIEXPORT
我是一名优秀的程序员,十分优秀!