2015-05-04 7 views
0

Когда я запускаю мой код указатель повреждаетсяМой указатель становится коррумпированным и я понятия не имею, почему

главный

#include <iomanip> 
#include <iostream> 
#include "Bucket.h" 
using namespace std; 

int main() 
{ 
    const int numberCount = 11; 

    int startingNumbers[numberCount] = { 100, 79, 255, 355, 70, 85, 10, 5, 47, 62, 75 }; 

    cout << "Initial Numbers" << endl; 
    for (int count = 0; count < numberCount; count++) 
    { 
     cout << startingNumbers[count] << " "; 
    } 
    cout << endl; 


    bucketSort(startingNumbers, numberCount); 

    system("pause"); 
} 

Bucket.h

void bucketSort (int startingNumbers[], int numberCount); 

Bucket.cpp

#include <iostream> 
#include "Bucket.h" 
using namespace std; 


void bucketSort(int startingNumbers[], int numberCount) 
{ 
    const int cols = 10; 
    const int rows = 11; 

    int row = 0; 
    int input = 0; 

    int *finger[cols]; 

    int table[rows][cols]; 

    for (int count = 0; count < numberCount; count++) 
    { 
     row = startingNumbers[count] % 10; 
     table[row][count] = startingNumbers[count]; 

     finger[count] = &table[row][count]; 
    } 

    for (int count = 0; count < numberCount; count++) 
    { 
     for (int col = 0; col < cols + 1; col++) 
     { 
      if (table[count][col] == *finger[col]) 
      { 
       startingNumbers[input] = *finger[col]; 
       input++; 
      } 
     } 
    } 
    for (int count = 0; count < numberCount; count++) 
    { 
     cout << startingNumbers[count] << endl; 
    } 
} 

Это не так я коррумпирован в соответствии с визуальной студией до конца, я неправильно использую указатель?

+2

Здесь 'input ++;' может быть больше размера массива. Вы запишитесь за конец массива, развращая значения других переменных. –

+1

Я бы сбросил C++ 14 из тегов. – drescherjm

+0

Рекомендуемое исправление? – Evan

ответ

1

Один вопрос здесь:

const int cols = 10; 
    //... 
    int *finger[cols]; 
    //... 
    for (int count = 0; count < numberCount; count++) 
    { 
     row = startingNumbers[count] % 10; 
     table[row][count] = startingNumbers[count]; 
     finger[count] = &table[row][count]; // <---- Issue Here 
    } 

Ваш finger массив объявлен как имеющий cols количество записей, но ваш доступ петли finger использованием count, который превысит значение cols. Другими словами, вы объявили свой массив fingers с определенным размером, но когда вы начинаете что-то делать с ним, вы не уважаете границы массива fingers.

Исправление, чтобы убедиться, что вы никогда не пройти мимо конца fingers массива, или если целью было сделать fingers иметь numberCount элементы, а затем использовать std::vector:

#include <vector> 
//... 
std::vector<int *> fingers(numberCount); 

Затем код остается неизменным и не потерпит краха. Являются ли результаты тем, что вы ищете с точки зрения сортировки чисел, это еще одна история. Но ваш код не сработает, если вы внесете эти изменения.

+0

Спасибо! Это один из тех моментов, когда я ударяю себя в лицо, не понимая этого. – Evan

Смежные вопросы