2017-02-18 6 views
2

Цели этой программы прямо сейчас, чтобы установить каждый переменный массив в 2D массива,Инициализация 2D-массива внутри функции, вызов по указателю. Получение Сегментация Fault

символ mass_data_shift [9] [9];, равный 'T'. Который должен равняться 100 Ts в целом.

Это делается путем вызова функции void с этим адресом 2D-массива в качестве аргумента. Вызов его указателем на то, чтобы он был инициализирован в цикле.

Внутри петли были 2D-массив должен быть установлен в положение T.

* mass_data [mass_data_counter] [mass_data_counter_two] = 'T';

Однако ..... результаты программы в:

  • (чаще) сегментация Fault при попытке инициализации * mass_data [4] [2]
  • (иногда) A Ошибка сегментации после успешной (?) Программы.
  • (Иногда) Программа успешно работает.

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

#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 

void mass_data_define(char (*mass_data)[9][9]){ 

    int mass_data_counter; 
    int mass_data_counter_two = 0; 

    for (mass_data_counter=0;mass_data_counter<9;mass_data_counter++){ 
    do {  
     std::cout << "|Array #1 " << mass_data_counter 
       << " ::: |Array #2 " << mass_data_counter_two 
       << std::endl; 

     *mass_data[mass_data_counter][mass_data_counter_two] = 'T'; 

     std::cout << *mass_data[mass_data_counter][mass_data_counter_two]; 

     mass_data_counter_two++; 
     std::cout << "---------End of Counter 2 Init Code----------" << std::endl; 
    } while (mass_data_counter_two < 9); 

    mass_data_counter_two = 0; 
    } 
} 

int main() 
{ 
    char mass_data_shift[9][9]; 

    mass_data_define(&mass_data_shift); 

    std::cout << "-END-" << std::endl; 

    return 0; 
} 

Последняя редакция: Основная причина была решена с помощью szym ниже. Извините за пробелы и отсутствие iostream, была проблема форматирования, когда я сделал сообщение. Также изменил цикл, чтобы он соответствовал длине массива, как предлагается ниже.

+1

У вас есть только 81 место. Массив из N индексируется 0..N-1. Мне кажется, вы думаете, что размер массива равен N + 1, потому что вы говорите, что ваш массив 9x9 содержит 100 элементов. Он содержит только 81. –

+1

Похоже, вы зацикливаете от 0 до 9. Ваш массив поддерживает только от 0 до 8. –

+0

Хорошо, после того, как я изменил цикл, чтобы перейти от 0-8, а не к 0-9, я все еще получаю ошибку сегментации. Идеи? –

ответ

1
*mass_data[mass_data_counter][mass_data_counter_two] = 'T'; 

Должно быть

(*mass_data)[mass_data_counter][mass_data_counter_two] = 'T'; 

Естественно, то же самое относится и к линии:

std::cout << *mass_data[mass_data_counter][mass_data_counter_two] 

Но на самом деле этот тип указателя не нужно передать массив по ссылке в C/C++.

Вы должны вместо этого объявить:

void mass_data_define(char mass_data[9][9]) { 
    // To read: 
    char z = mass_data[3][6]; 
    // To write: 
    mass_data[2][1] = 'C'; 
} 

// elsewhere 
char my_mass_data[9][9]; 
mass_data_define(my_mass_data); 
+0

Что такое '* mass_data [mass_data_counter] [mass_data_counter_two]' здесь? Это какой-то произвольный адрес, на который он указывает? –

+0

А, да, я изменю его, чтобы больше не использовать указатель. Однако изменение его из * mass_data [mass_data_counter] [mass_data_counter_two] = 'T'; to (* mass_data) [mass_data_counter] [mass_data_counter_two] = 'T'; все еще не исправил ошибку сегментации, когда указатель сохранен. –

+0

Вы обновили оба случая использования '* mass_data [x] [y]' вместо правильного '(* mass_data) [x] [y]'? Я обновил ответ. – szym

0

Короткий ответ: Вот одна линия исправления в код так может продолжать использовать указатель и еще не получить ошибку сегментации:

 (*mass_data)[mass_data_counter][mass_data_counter_two] = 'T'; 

Долгосрочный ответ: Прочитано Create a pointer to two-dimensional array.

Для глубокого понимания того, как указатели для доступа к многомерным массивам, читайте this.

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