Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中,我声明指针的顺序真的很重要吗?getcwd()问题_C_Unix_Getcwd - Fatal编程技术网

在C中,我声明指针的顺序真的很重要吗?getcwd()问题

在C中,我声明指针的顺序真的很重要吗?getcwd()问题,c,unix,getcwd,C,Unix,Getcwd,在Solaris 5.8计算机上,我有以下代码: [非工作代码] char *buf; char *dir; size_t psize; psize = (size_t) 1024; dir = getcwd(buf, psize); char *dir; char *buf; ... dir = getcwd(buf, psize); 在这台unix机器上,上述操作不起作用,我在尝试运行程序时遇到了分段错误。仅当我在buf之前声明dir时,它才起作用: [工作代码] char *buf;

在Solaris 5.8计算机上,我有以下代码:

[非工作代码]

char *buf;
char *dir;
size_t psize;

psize = (size_t) 1024;
dir = getcwd(buf, psize);
char *dir;
char *buf;
...
dir = getcwd(buf, psize);
在这台unix机器上,上述操作不起作用,我在尝试运行程序时遇到了分段错误。仅当我在
buf
之前声明
dir
时,它才起作用:

[工作代码]

char *buf;
char *dir;
size_t psize;

psize = (size_t) 1024;
dir = getcwd(buf, psize);
char *dir;
char *buf;
...
dir = getcwd(buf, psize);

当使用另一种风格的Unix时,比如MacOSX,我没有任何关于如何编写代码的严格规则。有人能解释一下上面的例子是怎么回事吗?谢谢

声明指针的顺序将决定它们在内存堆栈中的放置顺序。我的猜测是,在示例一(而不是示例二)中,从
buf
地址开始的缓冲区溢出正在破坏
dir
。您的其他操作系统可能正在静默地防止此错误,或者以不同的方式处理它。

您只声明了一个指针,没有分配任何内存供getcwd写入。getcwd不会为您分配内存。你需要打电话给malloc自己分配。

申报顺序无关紧要

char *getcwd(char *buf, size_t size); The getcwd() function copies an absolute pathname of the current working directory to the array pointed to by **buf**, which is of length **size**. 在
char*buf之后时,
buf
包含垃圾值,当
getcwd()
尝试修改指向bu
buf
的内存时,它会导致
分段错误
以下是
getcwd(3)
中的:

第一个参数是指向存储路径名的缓冲区的指针。Mac OS X、Linux、Solaris和其他系统上存在的一个常见扩展是,如果第一个参数为NULL,则
getcwd()
将使用
malloc()
为您分配一个缓冲区,然后在使用完后,使用
free()
将其释放。POSIX允许此扩展,但不是必需的,因此在可移植代码中不应依赖它


在本例中,将未初始化的值作为第一个参数传递给
getcwd()
。如果它恰好等于NULL,那么将分配一个缓冲区;如果是其他无效指针,则可能会出现分段错误。由于该值未初始化,因此它可以有任何值,并且可能取决于声明的顺序。如果您希望通过
getcwd()
分配缓冲区,则显式传递NULL值;没有必要为此声明变量。不过,一个更具可移植性的解决方案是将指针传递到您自己的缓冲区,而不是依赖于此扩展。

谢谢,将其置零是有效的。我还读到getcwd()为缓冲区分配了内存,所以我不担心自己分配内存。我正在阅读,但想知道-在初始化指针为NULL时与等待分配指针时,是否有一个规则?没有隐式规则。每个函数都是不同的-请阅读手册页。比如说,答案很容易在
mangetcwd
@chucknelson中找到:大多数函数不会为您分配内存,所以规则是,提前自己分配指针。否则,您将垃圾传递给一个需要有效char*-buffer的函数。您根本不需要变量
buf
;只需将
NULL
作为第一个参数。因为C总是按值传递参数,所以作为参数传递给函数的任何变量都必须首先初始化。
char *dir = getcwd( NULL, 0 );

if ( dir == NULL ) { /* handle error */ }
/* use dir */
free( dir );
char buf[1024]; /* or allocate it with malloc(3) */

if ( getcwd( buf, 1024 ) == NULL ) { /* handle error */ }

/* use buf, DO NOT free it if it's on the stack or static, 
   only if malloc-ed */