C函数从文件地址到return文件名

C function to return file name from file address

我正在尝试编写一个函数,它将 return 从文件地址获取文件的文件名。它只是简单地复制地址的每个字符,从终止字符开始,直到第一个正斜杠 '\',到一个名为 name 的字符数组变量。然后,它只是将变量 name 中所有字符的顺序颠倒过来。我写了一个叫做 file_name() 的函数,像这样:

char* file_name(char* addr){
    static char name[100];
    char temp;
    int i = -1;
    for (; addr[i] != '\'; --i){
        name[-1-i] = addr[i]; // -1-i increases from 0 as i decreases. We get the reversed name of the file in "name"
    }
    int len = -i; //array length is simply -i. we know that through as i acts as the counter in the above iteration.
    for (int count = 0; count < len; ++count){
        temp = name[count];
        name[count] = name[len - 1 - count];
        name[len - 1 - count] = temp;
    }
    return name;
}

在收到编译器的警告并在 Google 上查找后,我已将 name 声明为静态变量。我发现不使用 static 关键字(或通过动态分配)声明它, name 被视为局部变量,并且作为数组,在 [=37= 之后得到 'deleted' ] 声明(我想知道一个正确的解释。我还是有点不明白那是什么。只有一个模糊的想法)。

现在,在将 main 函数添加到代码后,编译就可以了:

int main(int argc, char** argv){
    char* name = file_name(argv[1]);
    printf("File name is: %s", name);
    return 0;
}

现在,出于某种原因,我没有得到任何输出。我给可执行文件一个带有有效文件地址的参数,但它没有给出任何输出。最重要的是,它只会停顿几秒钟,然后退出。这是怎么回事?我不认为这是算法的问题。该函数没有问题 returning 数组,因为它在更简单的情况下运行良好。为什么它不起作用?

我正在使用 GNU 编译器集合开发 Windows 10。

P.S。 - 我很想知道标准库中是否已经有一个函数从地址 returns 文件名。尽管如此,我仍然想知道为什么我的代码不起作用。

这是一个可能导致崩溃的非常明显的错误:

int i = -1;
for (; addr[i]

同样-1-i也是错误的。这两个都是越界未定义行为的bug。

int len = -i;也是错误的。在 C 编程中,您不能 有负数组索引。正式源码见C17 6.5.6/8


array, gets 'deleted' after the return statement(I would like to know a proper explanation

任何半正经的 C 书籍中都会提到这个非常常见的初学者错误。关于它的 SO 规范常见问题解答 post 是:Can a local variable's memory be accessed outside its scope?


The function has no problem returning arrays, as it works well in a simpler case.

如果一个函数只适用于某些测试用例,那是一个非常强烈的迹象表明该函数 根本无法正常工作 并且只是由于(坏)运气给出了正确的结果其他情况。参见 What is undefined behavior and how does it work?