2017-06-21 65 views
0

我在include函数和main函数之前看到这行。请详细说明POSIX getline()函数的这个声明

size_t getline(char **lineptr, size_t *n, FILE *stream); 

我可以推断

  • 函数getline是一个函数,采用三个输入参数。我也明白文件指针(第三个参数)

如果我坚持

  • 我不明白其他两个输入参数,并为size_t函数getline。
  • size_t是这里的类型吗?
  • 另外两个* s是什么意思?我认为一个*是指针。
+1

参见在http://man7.org/linux/man-pages/man3/getline.3功能说明。 html –

+0

你应该**总是** RTFM! – Stargateur

+1

你可能会注意到POSIX说['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)返回一个'ssize_t'(一个相同大小的签名类型作为无符号类型'size_t')。所以,如果包含''标头并且启用了POSIX声明,则由于正式原型与问题中引用的原型之间的区别,代码将不会编译。 –

回答

3

size_t是一种类型。它可能在包含的头文件之一中定义。该函数返回该类型的值,其第二个参数是指向该类型值的指针。

您确定*表示指针。所以**是一个指向指针的指针。所以函数参数lineptr是内存中位置(A)的地址,它包含内存中另一个位置(B)的地址;第二个位置的数据应解释为char值。这意味着函数可以将存储在位置A的值改变为指向除B以外的某个位置。

2

指针变量需要内存来存储内存地址的值。如果你要定义一个指针变量来存储一个int型变量的地址,你可以定义指针这样的:

int *mypointer = NULL; 
int x = 10; 
//store the address of variable x 
mypointer = &x; 

我们知道,指针变量只是存储,这只是一些人的地址。因此那个指针变量在内存空间中也有地址。如何存储指针的地址?我们可以这样做:

int *mypointer = NULL; 
int x = 10; 
//the pointer store the x's address 
mypointer = &x; 

//define a pointer to store the pointer variable mypointer's address 
int **newpointer = &mypointer; 

所以,char **与int **类似。

类型size_t是unsigned int或其他类型。注意size_t是无符号类型,无论size_t是int类型还是其他人。类型ssize_t供在C.符号类型为简单起见,为size_t 也许定义如下:

typedef unsigned int size_t; 
typedef int ssize_t; 
+4

它也可以等同于'typedef unsigned long size_t;'或'typedef unsigned long long size_t;'或者其他实现看起来合适。 –

+1

是的,你是对的。实际上,我们不应该猜测size_t的确切定义。但是我们可以在C头文件中找到它的定义。如果我们在size_t和ssize_t之间有所区别,这很酷。例如,读取 或write函数中的size_t和ssize_t类型决定了这些函数可以运行的最大字节数(从文件读取或写入文件)。这些函数的reture类型是ssize_t,以便这些函数在调用失败时返回-1。但是这限制了从文件或文件操作字节的功能。 – WangYang