char *中的C ++坏PTR(无法评估表达式)

时间:2014-04-18 08:35:07

标签: c++

我一直在寻找相当多的答案,虽然有类似的问题我仍然无法改进我的代码,所以它会起作用。 我有一个简单的lifo结构,我试图添加一个元素并打印结构。它没有打印任何东西,当我在debbuging时,我有这个<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,因此字符串不是一个选项:)

2 个答案:

答案 0 :(得分: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;

}

当函数将头点输入null时。

head = new Variable;头中的

现在指向堆上新创建的变量

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

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

建议更改:

  • 按下一个函数,将一个Variable *返回给调用者。这是新的头脑。
  • 按下一个接受变量*&amp;的函数。作为输入/输出参数并返回其中的新头
  • (我的偏好)创建一个包含Variable * head memeber的deque结构。将deque *传递给所有这些函数(push / pop),并在这些函数中管理内存

答案 1 :(得分:0)

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

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

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

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

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

更好的是为你的堆栈定义一个类......

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