char *str = NULL;
str = Operation(argv[1]);
cout << Cal(str);
操作函数返回一个指针,但我真的不知道为什么str
中的Cal
是null
。
在第2行,它仍然有内容。我错过了什么?
char* Operation(char* name)
{
fstream file(name,ios::in);
char c;
char stack[256]; int count_stack = -1;
char result[256]; int count_result = -1;
while ( !file.eof() )
{
c = file.get();
if ( c=='(')
{
count_stack++;
stack[count_stack] = c ;
}
else if ( isOperand(c) )
{
count_result++;
result[count_result] = c;
}
else if ( isOperator(c) )
if ( isOperator( (stack[count_stack]) )>0 )
if ( isOperator(c) > isOperator( stack[count_stack] ) )// dua ra so sanh khi trong stack co n>=1 ptu
{
count_result++;
result[count_result] = c;
}
else
{
count_result++;
result[count_result] = (stack[count_stack]);
stack[count_stack]= c;
}
else
{
count_stack++;
stack[count_stack] = c ;
}
else if ( c==')') // Neu gap dau ngoac dong se lay het phan tu ra den khi gap ngoac mo
{
while( stack[count_stack] != '(')
{
count_result++;
result[count_result] = stack[count_stack];
count_stack--;
}
count_stack--;
}
}
while ( count_stack >=0 )
{
count_result++;
result[count_result] = stack[count_stack];
count_stack--;
}
return &result[0];
}
这是操作功能。我的指针非常糟糕:P
答案 0 :(得分:2)
好吧,首先,在您的Operation函数中,您将返回一个指向临时堆栈数组的指针。在操作中,您将char result[256]
声明为临时堆栈变量。您在此处分配的256个字节仅在Operation函数的持续时间内有效。因此,在Operation返回后使用指向result
的指针将导致未定义的行为。
要解决此问题,您可以选择以下几种方法:
1)您可以在堆上分配result
,(使用new
运算符)
2)更好的是,只需返回char*
对象,而不是返回std::string
指针,这样您就不必担心分配/释放内存了。
3)最后,如果您的程序是单线程的,您还可以通过声明char result[256]
简单地将static char result[256]
设为静态变量。这样,即使从操作返回,指针也会有效。
我建议选项2。
答案 1 :(得分:1)
str
是指向指针的指针。如你所说,Operation
返回一个指针(指向什么?)。你应该得到一个诊断(类型不匹配)。