【问题标题】:Access violation when pointer is not pointing to NULL指针未指向 NULL 时的访问冲突
【发布时间】:2014-03-16 14:41:09
【问题描述】:

这个小代码导致运行时错误“访问冲突”。 我在网上读到它说当指针指向 NULL 时,它的值不能改变。 但这并没有解决问题。

#include<iostream>
using namespace std;
int max=3;
struct node
{
    char *ptr;
}*start, *current = start;

void init()
{
    current->ptr = (char*)malloc(max*sizeof(char)); //ERROR IN THIS LINE. 
}
void add(char page)
{
    char *c;
    c = current->ptr;
        if (page == *c)
            cout << "Yes";
        else
            cout << "No";
}
void main()
{
    init();
    add('a');
    cin >> max;
}

【问题讨论】:

  • 您需要使指针指向可以写入的内容。目前,出于所有意图和目的,它们指向随机位置。
  • @juanchopanza 当我让指针指向一个动态分配的空间时,它不会指向那个位置的垃圾值吗?
  • 不,它将指向您可以写入的动态分配的内存段。

标签: c++ pointers error-handling runtime access-violation


【解决方案1】:

这个

struct node
{
    char *ptr;
}*start, *current = start;

不创建节点结构,只创建指针。所以“当前”没有初始化。 改为

struct node
{
    char *ptr;
}start, *current = &start;

或在 main() 或 init() 中添加正确的内存分配

current = (node*)malloc(sizeof(node));

【讨论】:

  • current 在这里不是 NULL。它有一个不确定的值。
  • 我不确定,但我认为如果全局内存是否用零填充,可以设置 GCC 选项。
  • 糟糕,我没有意识到变量是全局的。对于那个很抱歉!根据 C++ 标准,指针是零初始化的,所以你的第一个答案是正确的。我的错。
  • 当前 = (node*)malloc(sizeof(node));没关系,但我想要一个 char 指针指向节点中 malloc 分配的内存的第一个字节(第一个字符)。
  • 试试这个char *char_pointer = (char*)malloc(sizeof(node));char *char_pointer = (char*) current
【解决方案2】:

发生代码转储是因为您正在访问一个未初始化的指针。 在尝试取消引用之前,应将“当前”初始化为有效的内存位置。 更简洁的代码将是

#include<iostream>
using namespace std;
int max=3;
struct node
{
    char *ptr;
};

struct node* start = new node();
struct node* current = start;

void init()
{
    current->ptr = (char*)malloc(max*sizeof(char)); //ERROR IN THIS LINE. 
}
void add(char page)
{
    char *c;
    c = current->ptr;
        if (page == *c)
            cout << "Yes";
        else
            cout << "No";
}
void main()
{
    init();
    add('a');
    cin >> max;
}

【讨论】:

  • 你能帮我弄清楚这个概念吗:指针总是指向一个值。如果我们使用 malloc,它将分配一个空间并让指针引用它。否则指针可以指向其他地方。那么 node *start=new node(); 的意义是什么? NEW NODE() 特别是。
  • 一个未初始化的指针指向一个可以是任何东西的位置。访问这将导致程序在您尝试读取或写入您无权访问的内存时进行核心转储。通过 new node() 我们从堆中分配内存并将其分配给 ptr 。
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多