链表访问冲突写入位置

Posted

技术标签:

【中文标题】链表访问冲突写入位置【英文标题】:linked list access violation writing location 【发布时间】:2016-02-14 20:57:09 【问题描述】:

我正在编写一个使用 SSN 进行 LSD 基数排序的程序。该程序会将数字解析为 3 位数字并执行 3 次传递。每次通过我将数字存储到相应的数组元素 bucket[];如果有重复,我会在该位置创建一个链接列表,并将重复的列表存储在已经存在的列表后面。当我尝试在链表末尾插入时,代码会中断。

编辑新的错误信息

class node
 
public:
    node(int n, node *p)data=n;next=p;
    int data;
    node *next;
;


void genData(int *dta, int n) 


for(int i=0; i < n; i++)// generate the social security numbers at random
    dta[i] =  rand()%889 + 111 + 1000*(rand()%889 + 111) + 1000000*                            (rand()%889 + 111);
 

int radixSort(int *dta, int n, int *out)
 
// the dta array contains the data to be sorted.
// n is the number of data items in the array
// out is the array to put the sorted data

node *bucket[1000]; // declare an array of 1000 linked lists (head pointers)
int count = 0; // use this to count the instructions to graph the big-o
for(int i = 0; i < n; i++)out[i] = dta[i]; 

for (int pass = 0; pass < 3; pass++)

    for (int j = 0; j < 1000; j++)
        bucket[j] = NULL;
    
    delete bucket;
    delete[]bucket;

    for (int i = 0; i < n; i++)
        int index=0;
        switch (pass)
        
        case 0:
            index = out[i] % 1000;
        case 1:
            index = (out[i]/1000) % 1000;
        case 2:
            index = out[i] / 1000000;
        ;
        if (bucket[index] = NULL)
            bucket[index] = new node(out[i], NULL);
        
        else

            node *cur=bucket[index];
            while (cur->next!= nullptr)   //****access violation reading location
                cur = cur->next;
            
            node *ptr = new node(out[i], NULL);
            cur->next = ptr;
        
    
    int idx = 0;
    for (int i = 0; i < 1000; i++)
        if (bucket[i] == NULL) continue;
        else
            out[idx] = bucket[i]->data;
            idx++;
            count++;
        
    

【问题讨论】:

curwhile(cur!=NULL) 之后为空 【参考方案1】:

你的代码有很多问题:

    在您的 switch 语句中,您有像 index == out[i] % 1000;Those 这样的行进行比较,我怀疑这就是您想要的。作业使用单个 = 您的初始化for (int j = 0; j &lt; 1000; j++)bucket[j] = NULL; 不会检查其中是否已经存在一个指针——这将在第一次通过后导致内存泄漏。请记住:每个new 都需要一个delete。 这就是可能破坏您的代码的原因:while (cur!= NULL)cur = cur-&gt;next; 一旦 cur 是 nullptr 就退出 while 循环 - 这意味着尝试在 2 行之后取消引用它是试图取消引用 nullptr 和一个坏主意。为了获得最后一个元素,您可能要检查的是 `while(cur->next != nullptr)

请注意:如果您的编译器支持nullptr,则最好使用它,即使您可能需要通过适当的标志启用 C++11。

【讨论】:

我之前使用的是while (cur-&gt;next !=nullptr),但它给了我一个访问冲突读取位置错误 您的next 是否在node-constructor 中正确初始化? 是的class nodeint data; node* next; node(int n, node *p)data=n; next=p; 您是否将它与其他更正一起使用?因为如果我没有看到实际的代码,我只能推测当时可能还有什么问题。在上面发布的代码中,你肯定是在取消引用 nullptr 是的,我修复了它们。我刚刚发布了编辑后的版本。你能看看吗? delete 似乎也在触发断点。

以上是关于链表访问冲突写入位置的主要内容,如果未能解决你的问题,请参考以下文章

创建链表时访问冲突错误

在 filePath.exe 中的 0x793F3729 (vcruntime140d.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCDCDCDCD

哈希表和链表的 C++ 访问冲突

算法: 实现LRU缓存,读取写入O实现

写入位置0x00460000时发生访问冲突,这是啥原因?

HashMap为什么是线程不安全的