写了一个简单的归并排序,产生了警告C6386写入 "temp" 时缓冲区溢出和警告C6001使用未初始化的内存“*temp”。
void merge(int* arr, const int& left, const int& mid, const int& right)
{
int i = left;
int j = mid + 1;
const int len = (right - left) + 1;
int* temp = new int[len];
int k = 0;
while (i <= mid && j <= right)
temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
while (i <= mid)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];//缓冲区溢出?
for (int i = 0; i < len; ++i)
arr[left + i] = temp[i];//未初始化内存?
delete[]temp;
}
void mergeSort(int* arr, const int& left, const int& right)
{
if (left == right)
return;
int mid = (left + right) >> 1;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
void MergeSort::sort(int* arr, const int& len)
{
cout << "归并排序" << endl;
mergeSort(arr, 0, len - 1);
}
找了半天没发现警告的原因,经过测试程序是能正常运行的。
溢出问题单点调试下,你看看right>arr长度的情况,修改下第一个循环:
void merge(int* arr, const int& left, const int& mid, const int& right)
{
int i = left;
int j = mid + 1;
const int len = (right - left) + 1;
int* temp = new int[len];
int k = 0;
while (i <= mid && j <= right && k < len)
temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
while (i <= mid)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];//缓冲区溢出?
for (int i = 0; i < len; ++i)
arr[left + i] = temp[i];//未初始化内存?
delete[]temp;
}
我可以为您解决这个问题。
C++中的缓冲区溢出和未初始化内存的警告很常见。您应该始终避免出现这些警告,因为它们可能在程序中导致意料之外的行为。下面是一些解决方案:
void mering(int a,int i,int b,int j) { int x=0,y=0,k=0,m; int temp[MAXSIZE]; while(x<i&&yb[y]?temp[k++]=b[y++]:temp[k++]=a[x++]; } while(x<i) temp[k++]=a[x++]; while(y<j) temp[k++]=b[y++]; for(m=0;m<(i+j);m++) { if(m>=MAXSIZE || k>=MAXSIZE) { cout << "错误:数组超出边界" << endl; return; } a[m]=temp[m]; } }
bookdate* head = new bookdate(); head->name = ""; head->writer = "";
3.其他细节 如果您已经采取了上述步骤并且仍然看到警告,则应检查您的代码是否存在其他错误。您应该始终检查变量和指针是否被初始化并分配了足够的空间。还可以使用调试工具(例如gdb)来查找内存分配错误和缓冲区溢出等问题。
希望我的解决方案可以帮助您解决这个问题。