如何解决我该如何在结构体内建立一个指向另一个指针指向的相同字符串的指针?
我有以下代码:
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
指向的区域?
解决方法
我感觉到有些臭味...即,您的所有变量似乎都是(在堆栈上的)局部变量,当函数返回时,它们不再存在。
您的函数将以
结尾return abc;
然后您松散所有内容,因为您说abc= &def;
并且def
也是局部变量。所以是的,您可以简单地执行abc->line= p1;
,但是在返回之后,您丢失了abc
(它指向def
,这是一个不再存在的堆栈变量),因此您也丢失了abc->line
,所以您会发生内存泄漏。
因此,您应该扩展显示给我们的代码,以便我们说“是的”。
下面是一个错误的函数示例:
struct el{
char *line;
struct el *next;
};
struct el *example(void)
{
struct el *abc,def; // def is a local variable
char *p1;
char buffer[100];
abc = &def;
gets(buffer);
p1 = malloc( strlen(buffer) + 1 );
strcpy( p1,buffer);
abc->line= p1;
return abc; // def won't exist anymore after the function returns
}
要解决此错误,您还应该执行abc= malloc(sizeof(struct el));
或将指针变量传递给该函数,例如:
void example2(struct el *abc)
{
char *p1;
// ...
abc->line= p1;
}
并致电,例如:
int main(void)
{
struct el pqr = {0};
example2(&pqr);
// ...
}
,
如何使
line
指向由p1
指向的相同字符串而又不分配两次相同的字符串?写够了吗?abc->line = p1;
是的,您可以这样做。 abc->line
将指向与p1
相同的内存地址。
还是我还需要释放'p1'指向的区域?
不,您不需要同时释放两者。您应该使用:
free(abc->line);
或:
free(p1);
您只需要其中之一,因为两个指针都指向同一个内存地址,那么当您释放一个指针时,您将同时释放两个指针。
请注意,通过释放abc->line
,p1
将成为悬空的指针,将毫无意义。
Recommended read关于gets
。
首先,不建议使用gets()。一个不错的替代品是fgets()。
如何在不分配两次相同字符串的情况下使“线”指向由“ p1”指向的相同字符串?
只需将两个指针设置为指向缓冲区的地址,它们都可以指向同一缓冲区。动态内存分配不是必需的。 输入您的代码:
//the following are created in file global scope
struct el{
char *line;
struct el *next;
};
struct el *abc,def;
char *p1;
char buffer[100];
//The following is performed in local scope within a function,using global variables created above.
p1 = &buffer[0];//assign address of buffer to pointer p1
//same for char *line:
abc->line = &buffer[0];//assign address of buffer to member *line
//both will now accept input using fgets()
fgets(p1,sizeof(buffer),stdin);
fgets(abc->line,stdin);
,
如何使
line
指向由p1
指向的相同字符串而又不分配两次相同的字符串?写abc->line = p1
够了吗?
是的。 abc->line = p1;
是正确的。
还是我还需要释放
p1
所指向的区域?
不,一点也不。相反,如果您这样做,line
会指向无处。
请注意,abc->line = p1;
仅将malloc()
从p1
分配给line
的块的内存地址的值分配给结构成员malloc()
。它们都是对gets()
分配的**相同**内存的引用。
永远不要使用class NestedArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id','title','url','summary','img',"published_date",'site')
class SiteSerializer(serializers.ModelSerializer):
articles = NestedArticleSerializer(many=True)
class Meta:
model = Site
fields = ('id','name','articles')
class NestedSiteSerializer(serializers.ModelSerializer):
class Meta:
model = Site
fields = ('id','url')
class ArticleSerializer(serializers.ModelSerializer):
site = NestedSiteSerializer()
class Meta:
model = Article
fields = ('id','site')
。原因是here。自C11以来,它也已从C标准中删除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。