首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有指针的getcwd()返回"null“

带有指针的getcwd()返回"null“
EN

Stack Overflow用户
提问于 2016-05-21 12:48:06
回答 4查看 1.8K关注 0票数 1

我试着回忆一下C编程。

我自己发现的一项任务是在函数之间传递字符串的变量和指针。

所以-我想做的是:

  • 创建一个数组;
  • 创建指向此数组的指针;
  • 将指针作为参数传递到另一个函数;
  • 在第二个函数中调用getcwd()
  • 打印结果。

这是我的密码:

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>

int ch_str(char point1[]) {
    printf("Point 1: %s\n", point1);
}

int getpath (char point2[]) {
    printf("Path: %s\n", getcwd(point2, sizeof(point2)));
}

int main () {

    char str[20] = "this is string";
    char *pStr;
    pStr = &str;

    ch_str(pStr);

    char pathname[1024];
    char *pPathname;
    pPathname = &pathname;

    getpath(pPathname);

    printf("Direct: %s\n", getcwd(pathname, sizeof(pathname)));

    return 0;
}

ch_str()这里-只是对我的“测试”,以确保我做得对(他-他)的指针。这部分起作用了。

但是,以指针作为参数的getcwd() --只需重新设置"null":

$ ./deploy 1:这是字符串路径:(null) Direct: /home/setevoy/ci

我想-这里有一些(大.)从我的角度理解C中的指针,但是:

getcwd()函数将当前工作目录的绝对路径名复制到由buf指向的数组中。

数组(pathname[1024])通过指针pPathname传递,那么为什么getcwd()不能保存到pathname[1024]位置的路径?我在这里看不到什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-21 12:58:06

在C中,数组作为函数参数是通过引用传递的,而不是按值传递的.

这意味着在您的代码中,在函数getpath中,char point2[]的大小是char *的大小,而不是参数所指向的数组的大小。

由于指针的大小太小,无法包含整个路径,因此将返回NULL。来自getcwd手册:

函数将当前工作目录的绝对路径名复制到buf所指向的数组,该数组具有长度大小。如果当前工作目录的绝对路径名(包括终止空字节)的长度超过了size 字节,则返回,并将errno设置为ERANGE;应用程序应检查此错误,并在必要时分配更大的缓冲区。

票数 2
EN

Stack Overflow用户

发布于 2016-05-21 13:05:20

将数组作为参数传递时,函数将只获得指向第一个元素的指针。在此过程中,有关数组大小的信息将丢失。所以这是你的问题。

getcwd(point2, sizeof(point2)));这个sizeof()是个问题。

在这里阅读更多信息:What is array decaying?

票数 2
EN

Stack Overflow用户

发布于 2016-05-21 13:05:34

引用getcwd手册:

返回值 成功完成后,将返回指向路径名的指针。或者,返回一个空指针,并将全局变量errno设置为指示错误。此外,getwd()将与errno连接的错误消息复制到buf引用的内存中。

因此,您可以打印errno (optionnaly,您可以使用strerror(3))来获得调用失败的原因。

您的代码基本上可以在我的计算机上工作,尽管我的编译器对您的转换抱怨很多。

我不明白为什么要使用这个数组,手册指出,如果不提供缓冲区,它将被分配,您必须在上面使用free(3)。因此,基本上,您的代码可以是:

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

char* getpath (void) {
  char *path = getwd(NULL);
  printf("Path: %s\n", path);
  return path;
}

int main () {
  char * dir = getpath();
  printf("I've got current path: %s\n", dir);
  free (dir);

  return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37363140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档