我有一个使用结构的堆栈。我弹出时需要返回一个字符串。因此我尝试使用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;
}
任何人都可以帮助...
答案 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);