【问题标题】:C++ bad PTR in char* (Expression cannot be evaluated)char* 中的 C++ 错误 PTR(无法评估表达式)
【发布时间】:2014-04-18 08:35:06
【问题描述】:

我一直在寻找一个答案,虽然有类似的问题我仍然无法改进我的代码,所以它可以工作。 我有一个简单的 lifo 结构,我正在尝试添加一个元素并打印该结构。它什么也不打印,当我调试时,我有这个<bad ptr> in char * nameOfVariable

如果有任何帮助,我将不胜感激!这是我的源代码:

#include<stdio.h>

struct Variable 
{ 
    double value; 
    char *name;
    struct Variable *next; 
} *variables[80000];

void pop(Variable * head);
void push(Variable * head, char *name, double value);
void show(Variable * head);


int main(){


for(int i = 0; i <80000; i++){
    variables[i] = nullptr;

}

char *nameOfVariable = "aaab";
double value = 5;
push(variables[0], nameOfVariable, value );
show(variables[0]);


system("pause");
return 0;
}
void push(Variable *  head, char *name, double value)
{
    Variable * p ;

    p = head;

    head = new Variable;
    head -> name = name;
    head -> value = value;
    head -> next = p;

}


void pop(Variable *  head)
{
    Variable *p; 

    if (head != NULL) 
    { 
       p = head; 
       head = head -> next; 
       free(p); 
    } 
}
void show(Variable * head)
{
Variable *p; 

p = head; 
    while (p!=NULL){
         printf("%c %f ", p->name, p->value);
         p=p->next;
}
printf("\n");
}

PS - 我不能使用 STL,所以字符串不是一个选项 :)

【问题讨论】:

    标签: c++


    【解决方案1】:

    您正在将指针存储到参数位置:

    void push(Variable *  head, char *name, double value)
    {
    Variable * p ;
    p = head;
    head = new Variable;
    

    但参数位置是函数本地的,返回时丢弃。

    为什么要分配一个包含 80000 个元素的数组?

    要通过函数更改位置,您必须传递该位置的地址(在您的情况下为 Variable** head)或使用引用。

    为您的堆栈定义一个类会更好......

    还有一个:将变量的名称存储为char* 几乎肯定会在以后造成麻烦。准备为char[] 分配内存并复制名称字符串。

    【讨论】:

    • 谢谢你 - 使用参考帮助。我正在使用 80 000 个元素,因为这将是 hashmap 的一个实现,并且因为我将获得大约 5 万个变量,所以最好不要有这么多的冲突(我认为 :))
    【解决方案2】:

    你没有保存你在 push 中创建的变量,所以它们都会丢失

    void push(Variable *  head, char *name, double value) {
      Variable * p ;
      p = head;
    
      head = new Variable;
      head -> name = name;
      head -> value = value;
      head -> next = p;
    
    }
    

    函数进入时head指向null。

    head = new Variable; 中的 head 现在指向堆上新创建的变量

    当函数退出时,没有人会跟踪堆上新创建的变量。内存泄漏,无法访问该元素。

    注意:您应该知道,您在函数推送中写入head 的更改不会影响您传递给函数的variables[0]。 variables[0] 是指向某个地方的变量的指针。最初它是nullptr,这意味着它不指向任何东西。 head 是variables[0] 的副本,这意味着恰好指向内存中同一位置的不同指针(在您的情况下为nullptr)。这意味着,如果您更改 head,它会指向其他对象,并且不再指向与 variables[0] 相同的对象

    建议的更改:

    • 使 push 成为向调用者返回变量*的函数。哪个是新头。
    • 使 push 成为接受变量*& 作为输入/输出参数并返回其中的新头的函数
    • (我的偏好)创建一个包含 Variable* 头成员的双端队列结构。将 deque* 传递给所有这些函数(push/pop),并在这些函数中管理内存

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多