char*中的C++错误PTR(无法计算表达式)
C++ bad PTR in char* (Expression cannot be evaluated)
我已经搜索了很长时间的答案,尽管也有类似的问题,但我仍然无法改进我的代码,所以它可以工作。我有一个简单的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,所以字符串不是一个选项:)
您正在将指针存储到参数位置:
void push(Variable * head, char *name, double value)
{
Variable * p ;
p = head;
head = new Variable;
但是参数位置是函数的本地位置,并且在返回时被丢弃。
为什么要分配一个包含80000个元素的数组?
为了通过函数更改位置,您必须传递该位置的地址(在您的情况下为Variable** head
)或使用引用。
更好的方法是为堆栈定义一个类。。。
还有一个:将变量名存储为char*
几乎肯定会在以后引起麻烦。准备分配char[]
的内存并复制名称字符串。
您没有保存您在推送中创建的变量,因此它们都会丢失
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
的更改不会影响传递给函数的variables[0]
。variables[0]是指向某个变量的指针。最初它是nullptr
,这意味着它不指向任何东西。head是variables[0]
的副本,这意味着一个不同的指针恰好指向内存中的同一位置(在您的例子中是nullptr
)。这意味着,如果您更改head
,它将指向其他对象,并且不再指向与variables[0]
相同的对象
建议更改:
- 使push成为一个函数,该函数向调用方返回一个变量*。这就是新的头。
- 使push函数接受一个变量*&作为输入/输出参数,并在
- (我的偏好)创建一个deque结构,该结构包含一个Variable*头member。将deque*传递给所有这些函数(推送/弹出),并在这些函数中管理内存
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 编译器是否强制根据模板参数计算表达式?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 如何在常量计算表达式中获取编译时错误?
- 计算表达式字符串由 std::map 中的键组成
- GDB 如何在运行时计算C++表达式
- 从C++调用 Python 或 Lua 来计算表达式,仅在需要时计算未知变量
- 错误指针:解析令牌时无法计算表达式
- 在c++lldb中使用重载运算符计算表达式
- 在不使用函数 pow 的情况下计算表达式的总和
- 使用 std::map<std::string, int> 计算表达式树
- 我怎么知道编译器是否C++编译时计算表达式
- BSTR bstrRtf = 0xcccccccccccccccc <调试时错误 Ptr>( = CXX0030:错误:无法计算表达式)
- 正在计算表达式C++
- CXX0030:错误:无法计算表达式
- 计算表达式
- 为什么c++应用程序可能不正确地计算表达式
- char*中的C++错误PTR(无法计算表达式)