gpt4 book ai didi

c - 为什么在 C 中不能使用 [] 为字符串分配内存?

转载 作者:行者123 更新时间:2023-11-30 18:18:09 26 4
gpt4 key购买 nike

对于 getline() 函数,我尝试了两种方法为字符串分配内存空间,但第一种有效,第二种无效。谁能解释为什么第二个不起作用?

第一个

#include <stdio.h>

int main()
{
int bytes_read;
int nbytes = 100;
char *my_string;

puts ("Please enter a line of text.");

/* These 2 lines are the heart of the program. */
my_string = (char *) malloc (nbytes + 1);
bytes_read = getline (&my_string, &nbytes, stdin);

if (bytes_read == -1)
{
puts ("ERROR!");
}
else
{
puts ("You typed:");
puts (my_string);
}

return 0;
}

第二个:

#include <stdio.h>
int main()
{
int bytes_read;
int nbytes = 100;
char my_string[nbytes+1];

puts ("Please enter a line of text.");

/* These 2 lines are the heart of the program. */
bytes_read = getline (&my_string, &nbytes, stdin);

if (bytes_read == -1)
{
puts ("ERROR!");
}
else
{
puts ("You typed:");
puts (my_string);
}

return 0;
}

第二个可以编译,但是当我执行它时:

bash-3.2$ ./a.out 
Please enter a line of text.
lsdfa
Bus error: 10

它显示总线错误:10

我不知道可能的原因是什么,有人可以帮助我吗?

最佳答案

The signature for getline requires a pointer to a char* so that it may be modified 。这是因为应该允许 getlinechar* 上调用 realloc 或分配一个 char* if您传递一个指向 0 的 char*:

getline() reads an entire line from stream, storing the address of the buffer containing the text into *lineptr.

...

In either case, on a successful call, *lineptr and *n will be updated to reflect the buffer address and allocated size respectively

在第一种情况下,一切都很好,因为您传递给 getline 的指针可以修改。

在第二种情况下,您将传递一个指向 char 数组的指针,该数组本身无法修改。正如您所发现的,不幸的是 &my_string 最终看起来像 char**,因此编译器不会提示(但可能会使用 -Wall )。

基本上,由于 getline 需要能够修改 lineptr 指向的内容,在第二种情况下这是无法完成的(因此出现总线错误)。

关于c - 为什么在 C 中不能使用 [] 为字符串分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10424297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com