链表访问冲突写入位置
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++;
【问题讨论】:
cur
在while(cur!=NULL)
之后为空
【参考方案1】:
你的代码有很多问题:
-
在您的 switch 语句中,您有像
index == out[i] % 1000;
Those 这样的行进行比较,我怀疑这就是您想要的。作业使用单个 =
您的初始化for (int j = 0; j < 1000; j++)bucket[j] = NULL;
不会检查其中是否已经存在一个指针——这将在第一次通过后导致内存泄漏。请记住:每个new
都需要一个delete
。
这就是可能破坏您的代码的原因:while (cur!= NULL)cur = cur->next;
一旦 cur 是 nullptr 就退出 while 循环 - 这意味着尝试在 2 行之后取消引用它是试图取消引用 nullptr 和一个坏主意。为了获得最后一个元素,您可能要检查的是 `while(cur->next != nullptr)
请注意:如果您的编译器支持nullptr
,则最好使用它,即使您可能需要通过适当的标志启用 C++11。
【讨论】:
我之前使用的是while (cur->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