0

我在我的程序中看到分段错误 (segfault) 的发生,因为我使用一个 apidirname在我用 C for Linux 编写的代码中将路径拆分为目录和文件名。

dirmane用于获取目录名,basename用于获取文件名,按照这里的说明。

下面给出了准系统代码,它在 Linux 上编译和运行良好。

#include <stdio.h>
#define _GNU_SOURCE         
#include <string.h>

void main (void)
{
    char *dirc, *basec, *bname, *dname = NULL;
    char *path = "."; /* I compile this code, for different paths as given below*/

    dirc = strdup(path);
    basec = strdup(path);
    dname = dirname(dirc);
    if (dname == NULL)
    {
        /* precautionary check */
        printf("null pointer\n");
    }
    bname = basename(basec);
    printf("dirname=%s, basename=%s\n", dname, bname);
}

我在变量中提供了不同类型的字符串,path以查看这些字符串是如何拆分为“目录”和“文件名”的。根据上面链接中给出的示例,我期待最终结果(粘贴在下面以供快速参考)。

在此处输入图像描述

当我将路径设置为以下任何示例时,我会得到 SegFault,因为dirname(如果我将其注释掉,那么我不会得到 segfault)。

*path = "."
*path = ".."
*path = "usr"
*path = "usr/"

根据上表,我不应该得到 SegFault,而是一个指向 '.' 的指针。在这种情况下按目录名字符串。我无法得到它,因为发生了段错误。正如您在上面看到的,我还添加了对空字符串的检查,以捕获任何空指针问题,但程序也没有到达那里。

让我知道我是否遗漏了某些内容或此问题中的某些信息不完整。

4

1 回答 1

2

你不包括 libgen.h 因此没有声明 dirname 因此假定它返回一个 int 因此你的程序已损坏并且你得到一个段错误。

于 2016-01-05T09:03:30.927 回答