我试着回忆一下C编程。
我自己发现的一项任务是在函数之间传递字符串的变量和指针。
所以-我想做的是:
getcwd();这是我的密码:
#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]位置的路径?我在这里看不到什么?
发布于 2016-05-21 12:58:06
在C中,数组作为函数参数是通过引用传递的,而不是按值传递的.
这意味着在您的代码中,在函数getpath中,char point2[]的大小是char *的大小,而不是参数所指向的数组的大小。
由于指针的大小太小,无法包含整个路径,因此将返回NULL。来自getcwd手册:
函数将当前工作目录的绝对路径名复制到buf所指向的数组,该数组具有长度大小。如果当前工作目录的绝对路径名(包括终止空字节)的长度超过了
size字节,则返回,并将errno设置为ERANGE;应用程序应检查此错误,并在必要时分配更大的缓冲区。
发布于 2016-05-21 13:05:20
将数组作为参数传递时,函数将只获得指向第一个元素的指针。在此过程中,有关数组大小的信息将丢失。所以这是你的问题。
getcwd(point2, sizeof(point2)));这个sizeof()是个问题。
在这里阅读更多信息:What is array decaying?
发布于 2016-05-21 13:05:34
引用getcwd手册:
返回值 成功完成后,将返回指向路径名的指针。或者,返回一个空指针,并将全局变量errno设置为指示错误。此外,getwd()将与errno连接的错误消息复制到buf引用的内存中。
因此,您可以打印errno (optionnaly,您可以使用strerror(3))来获得调用失败的原因。
您的代码基本上可以在我的计算机上工作,尽管我的编译器对您的转换抱怨很多。
我不明白为什么要使用这个数组,手册指出,如果不提供缓冲区,它将被分配,您必须在上面使用free(3)。因此,基本上,您的代码可以是:
#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;
}https://stackoverflow.com/questions/37363140
复制相似问题