MST

星途 面试题库

面试题:C语言中errno的常见使用场景

在C语言中,简述errno通常在哪些函数调用的场景下会被设置?请举例说明至少两个不同类型函数(如文件操作函数、内存分配函数)中errno的具体设置情况及含义。
19.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 文件操作函数 - 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,其含义是“没有那个文件或目录”。这表示在指定路径下找不到要打开的文件。
  1. 内存分配函数 - 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,其含义是“无法分配内存”,表明请求的内存分配操作因系统缺乏足够的可用内存而失败。
  1. 数学函数 - 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函数的参数超出了其定义域(即不能为负数)。