【发布时间】:2022-11-14 14:10:23
【问题描述】:
我正在做一项任务,应该使用 getline 函数从终端读取用户的输入。这是我的代码:
int main(int ac, char **av)
{
printf("Write something: \n");
char **buf = NULL;
size_t buf_size = 0;
ssize_t bytes_read = getline(buf, &buf_size, stdin);
if (bytes_read != -1)
write(STDOUT_FILENO, buf, buf_size);
else
printf("An error occured\n");
free(buf);
return (0);
}
从上面的代码。我的程序显示文本:发生错误。 做了一些代码重构,这就是我想出的:
int main(int ac, char **av)
{
printf("Write something: \n");
char *buf = NULL;
size_t buf_size = 0;
ssize_t bytes_read = getline(&buf, &buf_size, stdin);
if (bytes_read != -1)
write(STDOUT_FILENO, buf, buf_size);
else
printf("An error occured\n");
free(buf);
return (0);
}
瞧!代码显示输入的任何内容,正是我想要的。所以我解决了我的问题。但是我想了解的是第一个代码 sn-p 有什么问题?这样做是对的吗?:
char **name = "John Doe";
或者
char **name = NULL;
我对在线编译器做了一些快速测试。这是代码:
int main() {
// Write C code here
char **name = "John Doe";
printf("%p\n", name); //0x55f5f9890004
printf("%p\n", *name); //0x656f44206e686f4a
printf("%c\n", *name); //J
printf("%p", "John Doe"); //0x55f5f9890004
return 0;
}
我意识到双指针只是被视为单个字符指针。不确定我的发现是否正确。如果您能对上述主要功能给出更好的解释,那就太好了。
【问题讨论】:
-
你需要打开编译器警告并阅读它们——然后你会被告知像
char **name = "John Doe";这样的事情实际上是不能做和调用的未定义的行为下线 -
@UnholySheep。我在编译时使用了这些标志: gcc -Wall -Werror -pedantic 。但没有错误
标签: c pass-by-reference getline pass-by-value double-pointer