C++ C+中的指针问题+;

C++ C+中的指针问题+;,c++,pointers,C++,Pointers,这是操作函数。我的指针很差:Pstr是指向指针的指针。正如您所说,操作返回一个指针(指向什么?)。您应该得到一个诊断(类型不匹配)。str是指向指针的指针。正如您所说,操作返回一个指针(指向什么?)。您应该得到一个诊断(类型不匹配)。首先,在操作函数中,您返回一个指向临时堆栈数组的指针。在操作中,您将char result[256]声明为临时堆栈变量。此处分配的256字节仅在操作函数的持续时间内有效。因此,在操作返回后使用指向result的指针将导致未定义的行为 要解决此问题,您有几个选项: 1

这是操作函数。我的指针很差:P

str
是指向指针的指针。正如您所说,
操作
返回一个指针(指向什么?)。您应该得到一个诊断(类型不匹配)。

str
是指向指针的指针。正如您所说,
操作
返回一个指针(指向什么?)。您应该得到一个诊断(类型不匹配)。

首先,在操作函数中,您返回一个指向临时堆栈数组的指针。在操作中,您将
char result[256]
声明为临时堆栈变量。此处分配的256字节仅在操作函数的持续时间内有效。因此,在操作返回后使用指向
result
的指针将导致未定义的行为

要解决此问题,您有几个选项:

1) 您可以在堆上分配
result
(使用
new
操作符)

2) 更妙的是,不用返回
char*
指针,只需返回
std::string
对象,这样就不必担心分配/释放内存

3) 最后,如果您的程序是单线程的,您还可以通过声明
静态char result[256]
char result[256]
作为静态变量。这样,即使您从操作返回,指针也将有效


我推荐选项2。

首先,在操作函数中,返回指向临时堆栈数组的指针。在操作中,您将
char result[256]
声明为临时堆栈变量。此处分配的256字节仅在操作函数的持续时间内有效。因此,在操作返回后使用指向
result
的指针将导致未定义的行为

要解决此问题,您有几个选项:

1) 您可以在堆上分配
result
(使用
new
操作符)

2) 更妙的是,不用返回
char*
指针,只需返回
std::string
对象,这样就不必担心分配/释放内存

3) 最后,如果您的程序是单线程的,您还可以通过声明
静态char result[256]
char result[256]
作为静态变量。这样,即使您从操作返回,指针也将有效



我推荐选项2。

您能发布操作函数和Cal函数的内容吗?@George Stocker:按原样使用NULL是完全可以的。如果共享您的代码没有危险供我们研究,这将是解决您问题的一大步。对不起,我编辑代码:|它只有一个*你能发布操作函数和Cal函数的内容吗?@George Stocker:按原样使用NULL是完全可以的。如果共享你的代码没有危险供我们研究,这将是解决你的问题的一大步。对不起,我编辑代码:|它只有一个*但仍然不可能在char**中存储void*?但仍然不可能在char**中存储void*?在操作函数中,我返回结果中第一个元素的地址,以便使用结果数组:|“您正在返回指向临时堆栈数组的指针”我看不到它。你能指出吗:我的老师让我在stl中没有容器的情况下做数学(操作数,运算符)。所以我不使用字符串。非常感谢。Stackoverflow很棒:)好吧,既然你不能使用字符串,你可以使用选项3(将数组声明为静态),只要你确定你的程序不是多线程的。(静态变量不是线程安全的)非常感谢salvia。问题解决了。我对线程安全知之甚少。我会研究:)‘result’是函数的局部变量。从逻辑上讲,当您从函数返回时,它不再存在。在操作函数中,我返回结果中第一个元素的地址,以便使用结果数组:|“您正在返回指向临时堆栈数组的指针”我看不到它。你能指出吗:我的老师让我在stl中没有容器的情况下做数学(操作数,运算符)。所以我不使用字符串。非常感谢。Stackoverflow很棒:)好吧,既然你不能使用字符串,你可以使用选项3(将数组声明为静态),只要你确定你的程序不是多线程的。(静态变量不是线程安全的)非常感谢salvia。问题解决了。我对线程安全知之甚少。我会研究:)‘result’是函数的局部变量。从逻辑上讲,当您从函数返回时,它将不再存在。
char *str = NULL;
str = Operation(argv[1]);
cout << Cal(str);
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];
}