gpt4 book ai didi

C 中的斩波路径

转载 作者:行者123 更新时间:2023-12-04 05:48:31 25 4
gpt4 key购买 nike

我想先说我很少用 C 进行编程,所以我更想知道为什么给定的解决方案有效,而不仅仅是它是什么。

我正在尝试编写一个函数,该函数将采用路径名,并将路径名返回到同一目录中的不同文件。

  "/example/directory/with/image.png" => "/example/directory/with/thumbnail.png"

在阅读了 realpath 的示例用途后,我尝试了什么和 dirname (我在 Linux 上工作;如果有跨平台的等价物,请告诉我)是:
#include <limits.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char *chop_path(char *orig) {
char buf[PATH_MAX + 1];
char *res, *dname, *thumb;

res = realpath(orig, buf);
if (res) {
dname = dirname(res);
thumb = strcat(dname, "/thumbnail.png");
return thumb;
}
return 0;
}

编译它似乎工作,但运行程序
int main(void) {
char *res = chop_path("original.png");
if (res) {
printf("Resulting pathname: %s", res);
}
return 0;
}

给我一个段错误。任何提示?

最佳答案

我看到的唯一问题是您的签名 chop_path常规;它应该是

char *chop_path(char *orig) {

您的版本缺少 * .这实际上产生了巨大的差异;没有 * ,您实际上是在告诉 dirnamerealpath将参数字符串中第一个字符的字符代码解释为路径的数字地址(即指向的指针)。这将指向您绝对没有分配的低内存位置;尝试使用它会导致“段错误”错误,这实际上意味着您正在尝试访问不允许的内存。

另一个问题原来是 dirname()函数在 libgen.h 中声明,您没有包括在内。如果不包含该头文件,编译器会假定 dirname()返回 int而不是指针,并且在 64 位体系结构上,函数的 64 位返回值被削减为 32 位,坏指针被分配给 dname ,这将导致您的段错误。

关于C 中的斩波路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10378112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com