C中有符号性的编译器错误

C中有符号性的编译器错误,c,compiler-warnings,C,Compiler Warnings,我是C语言的新手,在编译了一个运行正常的程序后,我收到了一些编译器警告 警告说: main.c:在函数“lsh\u read\u line”中: main.c:65:2:警告:“getline”传递参数2中的指针目标的符号性[-Wpointer符号]不同 getline(&line,&bufsize,stdin); ^ char*lsh\u读取行(无效) { char*line=NULL; ssize_t bufsize=0; getline(&line,&bufsize,stdin); 回流

我是C语言的新手,在编译了一个运行正常的程序后,我收到了一些编译器警告

警告说:

main.c:在函数“lsh\u read\u line”中:
main.c:65:2:警告:“getline”传递参数2中的指针目标的符号性[-Wpointer符号]不同
getline(&line,&bufsize,stdin);
^
char*lsh\u读取行(无效)
{
char*line=NULL;
ssize_t bufsize=0;
getline(&line,&bufsize,stdin);
回流线;
}
我看到的大多数解决方案都建议在分配缓冲区空间时使用指针,但我只是让getline分配内存本身,所以我不确定如何纠正这一点

此外,我认为这一警告是相关的,但我不知道它意味着什么,也不知道如何纠正它:

在main.c:4:0中包含的文件中:
/usr/include/stdio.h:678:20:注意:应为“size\u t*\u\u restrict\u”,但参数的类型为“ssize\u t*”
外部IO使用getline(字符**限制lineptr,
^

错误表明它期望的是
大小而不是
ssize\u t*


尝试将
ssize\u t bufsize=0;
更改为
size\u t bufsize=0;

错误表示它期望的是
size\u t*
而不是
ssize\u t*


尝试将
ssize\u t bufsize=0;
更改为
size\u t bufsize=0;
ssize\u t
size\u t
是不同的类型。
size\u t
是无符号整数类型,它是
sizeof
的返回类型和
*alloc
fread/fwrite
等函数的参数类型;de>尺寸\u t
在C标准中定义

另一方面,
ssize\u t
是一种有符号整数类型。它不是C标准的一部分,但在POSIX中用作返回函数的返回类型,例如返回写入/读取的字节数,或返回错误时的负值

您不应该将这两种类型相互混淆。注意
getline
返回
ssize\u t
,但使用指向
size\u t
的指针:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
getline
返回读取的字符数,但
*n
将包含分配给缓冲区的字节数。返回值的类型为
ssize\u t
-一个有符号整数-以便在出现错误时可以返回
-1
。另一方面,
size\u t
*alloc
函数的参数类型声明指出,如果
*lineptr
为非空,则
*n
应指向
*lineptr
的内存分配的现有大小

因此

char*lsh\u读取行(无效)
{
char*line=NULL;
大小;
ssize_t n_read=getline(&line,&bufsize,stdin);
如果(n_读数<0){
//处理错误条件?
//那么也许:
返回NULL;
}
回流线;
}


而有些人声称他们“只是”警告但是C编译器警告的真相通常是,在某些情况下,它们可能是严重错误,并导致程序具有未定义的行为

ssize\u t
size\u t
是不同的类型。
size\u t
是无符号整数类型,它是
sizeof
的返回类型和参数类型对于
*alloc
fread/fwrite
等函数;
size\u t
在C标准中定义

另一方面,
ssize\u t
是一种有符号整数类型。它不是C标准的一部分,但在POSIX中用作返回函数的返回类型,例如返回写入/读取的字节数,或返回错误时的负值

您不应该将这两种类型相互混淆。注意
getline
返回
ssize\u t
,但使用指向
size\u t
的指针:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
getline
返回读取的字符数,但
*n
将包含分配给缓冲区的字节数。返回值的类型为
ssize\u t
-一个有符号整数-以便在出现错误时可以返回
-1
。另一方面,
size\u t
*alloc
函数的参数类型声明指出,如果
*lineptr
为非空,则
*n
应指向
*lineptr
的内存分配的现有大小

因此

char*lsh\u读取行(无效)
{
char*line=NULL;
大小;
ssize_t n_read=getline(&line,&bufsize,stdin);
如果(n_读数<0){
//处理错误条件?
//那么也许:
返回NULL;
}
回流线;
}


虽然有些人声称它们“只是”警告,但C编译器警告的真相往往是,在某些情况下,它们可能是严重错误,并导致您的程序具有未定义的行为

是否有任何理由不使用正确的类型(大小)?即使程序“运行良好”,也会尝试解决警告,这一点被高估。是否有任何理由不使用正确的类型(大小?)?赞成即使程序“运行良好”也尝试解决警告。感谢您的帮助!这无疑提高了我对getline的理解。如果可以,您应该重用分配的内存(为此,您需要跟踪
大小\u t n
,这有助于避免堆碎片。感谢您的帮助!这无疑提高了我对getline的理解。如果可以,您应该重用分配的内存(为此,您需要跟踪
大小\u t n
,这有助于避免堆碎片)。