【发布时间】:2020-12-14 04:43:25
【问题描述】:
我有以下代码:
struct el{
char *line;
struct el *next;
};
struct el *abc, def;
char *p1;
char buffer[100];
abc = &def;
gets(buffer);
p1 = malloc(strlen(buffer) + 1 );
strcpy( p1, buffer);
如何使line 指向p1 所指向的同一个字符串,而不用两次分配同一个字符串?写够了吗:
abc->line = p1;
或者我还需要释放p1指向的区域吗?
【问题讨论】:
-
1) 不要使用
gets2)sizeof(strlen(buffer))完全错误 -
abc->line = p1不会创建副本。释放 p1 也会释放另一个指针(相同的地址) -
使用
fgets -
@Andrea 这不是速度问题。只是它不安全,因为它不对输入的大小执行任何检查(在您的情况下,由于
buffer的大小为 100,通过发送超过 100 个字符的输入将导致写入超出范围,这可能会使您的程序崩溃)。 -
abc->line = p1;完全按照您的想法进行。它获取 p1 中的值(这是一个地址)并将相同的值保存到 abc->line 中。现在 abc->line 和 p1 存储相同的地址。