C 如何使结构中的指针指向另一个指针指向的同一字符串?
我有以下代码: 结构el{ 字符*行; 结构el*下一步; }; 结构el*abc,定义; 字符*p1; 字符缓冲区[100]; abc=&def; getsbuffer; p1=mallocstrlenbuffer+1; strcpy p1,缓冲区; 如何使线指向p1指向的同一字符串而不分配同一字符串两次?写下以下内容是否足够:C 如何使结构中的指针指向另一个指针指向的同一字符串?,c,string,pointers,struct,C,String,Pointers,Struct,我有以下代码: 结构el{ 字符*行; 结构el*下一步; }; 结构el*abc,定义; 字符*p1; 字符缓冲区[100]; abc=&def; getsbuffer; p1=mallocstrlenbuffer+1; strcpy p1,缓冲区; 如何使线指向p1指向的同一字符串而不分配同一字符串两次?写下以下内容是否足够: abc->line = p1; abc->line = p1; 或者我还需要释放p1所指的区域吗 如何使线指向p1指向的同一字符串而不分配同一字符串
abc->line = p1;
abc->line = p1;
或者我还需要释放p1所指的区域吗
如何使线指向p1指向的同一字符串而不分配同一字符串两次?写下以下内容是否足够:
abc->line = p1;
abc->line = p1;
是的,你能做到。abc->行将指向与p1相同的内存地址
或者我还需要释放由“p1”指向的区域吗
不,你不需要两个都放。您应该使用:
free(abc->line);
或:
您只需要其中一个,因为两个指针都指向同一个内存地址,当您释放一个指针时,您将释放两个指针
请注意,通过释放abc->line,p1将成为一个悬空指针,它将不指向任何有意义的东西
关于得到
如何使线指向p1指向的同一字符串而不分配同一字符串两次?写下以下内容是否足够:
abc->line = p1;
abc->line = p1;
是的,你能做到。abc->行将指向与p1相同的内存地址
或者我还需要释放由“p1”指向的区域吗
不,你不需要两个都放。您应该使用:
free(abc->line);
或:
您只需要其中一个,因为两个指针都指向同一个内存地址,当您释放一个指针时,您将释放两个指针
请注意,通过释放abc->line,p1将成为一个悬空指针,它将不指向任何有意义的东西
关于GET。首先,不建议使用。一个好的替代品是
如何使“line”指向由“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, sizeof(buffer), stdin);
首先,不建议使用。一个好的替代品是
如何使“line”指向由“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, sizeof(buffer), stdin);
我感觉到有东西很臭。。。也就是说,当函数返回时,所有变量似乎都是堆栈上不再存在的局部变量 那么,您的函数是否以
return abc;
然后你失去了一切,因为你说abc=&def;def也是一个局部变量。是的,你可以简单地做abc->line=p1;但是在返回之后,您丢失了指向def的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=mallocsizeofstruct el;或将指针变量传递给函数,例如:
void example2(struct el *abc)
{
char *p1;
// ...
abc->line= p1;
}
int main(void)
{
struct el pqr = {0};
example2(&pqr);
// ...
}
例如:
void example2(struct el *abc)
{
char *p1;
// ...
abc->line= p1;
}
int main(void)
{
struct el pqr = {0};
example2(&pqr);
// ...
}
我感觉到有东西很臭。。。也就是说,当函数返回时,所有变量似乎都是堆栈上不再存在的局部变量 那么,您的函数是否以
return abc;
然后你失去了一切,因为你说abc=&def;def也是一个局部变量。是的,你可以简单地做abc->line=p1;但是在返回之后,您丢失了指向def的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=mallocsizeofstruct el;或将指针变量传递给函数,例如:
void example2(struct el *abc)
{
char *p1;
// ...
abc->line= p1;
}
int main(void)
{
struct el pqr = {0};
example2(&pqr);
// ...
}
例如:
void example2(struct el *abc)
{
char *p1;
// ...
abc->line= p1;
}
int main(void)
{
struct el pqr = {0};
example2(&pqr);
// ...
}
如何使线指向p1指向的同一字符串而不分配同一字符串两次?写abc->line=p1足够了吗
对。abc->line=p1;这是正确的
或者我还需要释放p1所指的区域吗
不,一点也不。相反,若你们这样做,这条线就不会指向任何地方
注意abc->line=p1;仅将malloc分配的区块的内存地址值从p1分配给结构成员行。它们都是对malloc分配的**相同**内存的引用
永远不要使用它。原因是。自C11起,它也从C标准中删除
如何使线指向p1指向的同一字符串而不分配同一字符串两次?写abc->line=p1足够了吗
对。abc->line=p1;这是正确的
或者我还需要释放p1所指的区域吗?
不,一点也不。相反,若你们这样做,这条线就不会指向任何地方
注意abc->line=p1;仅将malloc分配的区块的内存地址值从p1分配给结构成员行。它们都是对malloc分配的**相同**内存的引用
永远不要使用它。原因是。它也从C标准中删除,因为C11。1不使用gets 2 sizeofstrlenbuffer完全错误ABC->line=p1不创建副本。释放p1会释放其他指针太多相同的地址使用@Andrea这不是速度问题。它只是不安全,因为它不会对您的情况下的输入大小执行任何检查,因为缓冲区大小为100,通过发送超过100个字符的输入将使GET写入超出范围,这可能会使您的程序崩溃;做你想做的事。它接受p1中的值(地址),并将该值保存到abc->line中。现在abc->line和p1存储相同的地址。1不使用gets 2 sizeofstrlenbuffer完全错误abc->line=p1不创建副本。释放p1会释放其他指针太多相同的地址使用@Andrea这不是速度问题。它只是不安全,因为它不会对您的情况下的输入大小执行任何检查,因为缓冲区大小为100,通过发送超过100个字符的输入将使GET写入超出范围,这可能会使您的程序崩溃;做你想做的事。它接受p1中的值(地址),并将该值保存到abc->line中。现在abc->line和p1存储相同的地址。那么我需要使用指针到指针吗@保罗Ogilvie@Andrea-否,不需要使用双指针来更新结构实例的值。这不是保罗在这里提供的主要信息。他指的是,你已经在一个临时生命周期内创建了局部的、自动的变量。当执行流在函数中时创建的堆栈位置ADDRESS在离开时将不再存在。@Paul Ogilvie因此,假设struct el*abc是传递给函数的一个参数,当我写入abc->line=p1时,这个赋值在返回后还会保留吗?@Paul Ogilvie我的意思是,abc->line是否仍然指向函数内部分配的区域,即p1所指的区域?如果函数签名为void fstruct el*abc,则abc->line=p1;这是正确的。这是因为abc不再指向局部变量。所以我需要使用指向指针的指针吗@保罗Ogilvie@Andrea-否,不需要使用双指针来更新结构实例的值。这不是保罗在这里提供的主要信息。他指的是,你已经在一个临时生命周期内创建了局部的、自动的变量。当执行流在函数中时创建的堆栈位置ADDRESS在离开时将不再存在。@Paul Ogilvie因此,假设struct el*abc是传递给函数的一个参数,当我写入abc->line=p1时,这个赋值在返回后还会保留吗?@Paul Ogilvie我的意思是,abc->line是否仍然指向函数内部分配的区域,即p1所指的区域?如果函数签名为void fstruct el*abc,则abc->line=p1;这是正确的。这是因为abc不再指向局部变量。