Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使结构中的指针指向另一个指针指向的同一字符串?_C_String_Pointers_Struct - Fatal编程技术网

C 如何使结构中的指针指向另一个指针指向的同一字符串?

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指向的同一字符串而不分配同一字符串

我有以下代码:

结构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;
是的,你能做到。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不再指向局部变量。