【发布时间】:2019-09-10 04:04:18
【问题描述】:
在这两个版本中:
//VERSION 1
char *c=malloc(10);
c[0]='h';
c[1]='i';
c[2]='\0';
c[3]='l';
printf("%s\n",c);
我得到了预期的结果,即正在打印hi。
现在在这个:
//VERSION 2
char *c;
size_t siz=8;
c=malloc(sizeof(char)*(siz+1)); //char size is 1 byte on system
getline(&c,&siz,stdin);
c[siz]='\0';
printf("%s\n",c);
在输入值'hello world'时,输出是'hello world' - 我期待它在读取第9个字节后不会打印任何东西(它是设置为\0)。
为什么两者有区别?
这是因为第 2 版中的指针 c 指向 stdin 并且 `\0' 修改在流中不起作用吗?如果是,那么为什么编译器现在会发出任何警告或错误?
【问题讨论】:
-
调用
getline()后siz是什么? -
1 应该可以工作,对于 2,请参阅 man getline(3) "如果
*lineptr设置为NULL并且*n设置为0之前调用,然后getline()将分配一个缓冲区来存储该行。" -
@DavidC.Rankin 知道了 - 一定是调整大小的问题,那么为什么
\0的分配即使使用-Wall也不会生成错误/警告消息? -
因为在 C 中,边界检查是程序员的责任,C-Standard 中没有要求发出任何诊断(尽管一些编译器现在会标记它) 此外,
c[siz]是分配siz+1的在 范围内——因此分配没有任何问题。 (但如果您没有检查来自getline的返回,则所有投注都关闭,字符串末尾的 nul-terminating 毫无意义) -
@DavidC.Rankin 我的问题是因为
c指向stdin- 不应该将任何东西(在本例中为\0)分配给stdin生成错误/警告?
标签: c