- 文件操作函数 -
fopen
- 调用场景:当使用
fopen
函数尝试打开文件失败时,errno
会被设置。
- 示例代码:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *fp = fopen("nonexistent_file.txt", "r");
if (fp == NULL) {
printf("Error opening file: %s\n", strerror(errno));
}
return 0;
}
errno
设置及含义:如果文件不存在,errno
可能被设置为ENOENT
,其含义是“没有那个文件或目录”。这表示在指定路径下找不到要打开的文件。
- 内存分配函数 -
malloc
- 调用场景:当
malloc
函数无法分配请求的内存块时,errno
会被设置(在某些系统上,并非所有系统都保证设置errno
,但通常情况下会设置)。
- 示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main() {
char *ptr = (char *)malloc(1000000000000LL);
if (ptr == NULL) {
printf("Memory allocation failed: %s\n", strerror(errno));
}
return 0;
}
errno
设置及含义:如果系统内存不足,errno
可能被设置为ENOMEM
,其含义是“无法分配内存”,表明请求的内存分配操作因系统缺乏足够的可用内存而失败。
- 数学函数 -
sqrt
(以<math.h>
库函数为例)
- 调用场景:当
sqrt
函数的参数为负数时(因为在实数范围内,负数没有平方根),errno
会被设置。
- 示例代码:
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <string.h>
int main() {
double result = sqrt(-1.0);
if (errno == EDOM) {
printf("Domain error in sqrt: %s\n", strerror(errno));
}
return 0;
}
errno
设置及含义:errno
会被设置为EDOM
,表示“数学定义域错误”。这意味着传递给sqrt
函数的参数超出了其定义域(即不能为负数)。