无法从c

时间:2018-09-21 09:51:31

标签: c stack structure

我有一个使用结构的堆栈。我弹出时需要返回一个字符串。因此我尝试使用strcpy()将字符串复制到指针,但是当我运行该程序时,该程序将在该步骤停止工作。

这是堆栈的代码。

struct node{            // stack structure
    char data[5];
    struct node *link;
}*top=NULL;

这是弹出功能的代码。

char* pop(){
    printf("\nIn pop fun.");
    if(top==NULL)
    {
        printf("Error!!!\nStack Underflow.");
        return "error";
    }
    printf("\nChecked if pop is null.");
    char *popvar;
    printf("\nCreated new char pointer.");
    strcpy(popvar,top->data);
    printf("\nCopied data from top.");
    struct node *tmp = top;
    printf("\nCreated new node.");
    top=tmp->link;
    printf("\n Assigned top new value.");
    free(tmp);
    printf("\nFree temp");
    printf("\npoped from stack.");
    return popvar;
}

任何人都可以帮助...

2 个答案:

答案 0 :(得分:0)

动态分配的内存属于程序,并且即使作用域结束也存在。

作用域结束后,只有动态分配的内存可以存在,一旦函数结束,指针popvar也将结束,但在以下情况下不会结束:

 #include<stdio.h>
 #include<stdio.h>

 char *fun()
 {
    char *c=malloc(10);
    c[0]='h';
    c[1]='e';
    c[2]='l';
    c[3]='l';
    c[4]='\0';

    return c;
}

int main(){

    printf("%s",fun());

    return 0;   
}

将弹出的数据复制到动态分配的内存中,然后可以从该pop函数外部访问该内存。另外,在使用strcpy复制之前,您没有分配要在其中复制弹出值的内存。

答案 1 :(得分:0)

您不能通过strcpy()或其他方式写入未初始化的指针。那是写到未定义的内存地址,因此行为是未定义的。

如果您将strcpy()的数组声明为:

char popvar[5];
strcpy(popvar, top->data);

或一个struct node,它具有一个数组(不是指针)成员:

struct node popvar;
strcpy(popvar.data, top->data);

但是,如果不重新复制它们,就无法将这些值返回给pop()的调用者。为此,您可以分配动态(堆)内存:

char *popvar = malloc(5);
strcpy(popvar, top->data);
top = top->link;
return popvar;

在这种情况下,呼叫者必须始终记住针对此结果呼叫free()。每个malloc()的后面都必须紧跟着free(),否则会导致内存泄漏。请注意,您的原始程序曾经调用过free()却没有调用malloc() ;这是非法的,其行为是不确定的。

另一种可能性是要求调用者决定如何存储结果:

void pop(char *result) {
    strcpy(result, top->data);
    top = top->link;
}

此功能将允许以下两种用法之一:

char str[5];
pop(str);

或者:

char *str = malloc(5);
pop(str);
/* do stuff */
free(str);

甚至:

struct {
    int foo;
    int bar;
    char other_data[5];
} some_other_structure;
pop(some_other_structure.other_data);