-2

Я делаю эту программу, чтобы найти седловую точку матрицы (элементов есть наибольшее число на их колонок и в то же время наималейших их подряд)C - Сегментация Fault с динамическим распределением

Так , вот что, я получаю ошибку сегментации. При использовании окон это нормально работает, но когда я буду работать на Ubunto, это не сработает. У меня, к сожалению, только окна на моей машине, поэтому я не могу понять, почему он не работает или где он идет не так.

Не могли бы вы, ребята, помочь мне? Скажите мне, что не так с кодом, или где ошибка, пожалуйста!

int main(){ 
    int i, j, *ml, *mc, key = 1, z; 
    int ordem, **me; 
    char car; 

    /* ml = smallest of each row, mc = greatest of each column 
    * me = given matrix 
    * ordem = size of matrix */ 

    scanf("%d", &ordem); 

    me = malloc(ordem * sizeof(int)); 
    for(i = 0; i < ordem; i++){ 
     me[i] = malloc(ordem * sizeof(int)); 
    } 
    ml = malloc (ordem * sizeof(int)); 
    mc = malloc (ordem * sizeof(int)); 

    for(i = 0; i < ordem; i++){ 
     scanf("%d", &me[i][0]); 
     for(j = 1; j < ordem; j++){ 
      scanf(" %d", &me[i][j]); 
     } 
     do{ 
      z = scanf("%c", &car); 
     }while ((z != EOF) && (car != '\n')); 
    } 

В случае необходимости, я могу дать вам, ребята, остальную часть кода, но я совершенно уверен, что ошибка происходит там, либо на таНос или зсапЕ.

Большое спасибо, очень признательна за любую помощь! С наилучшими пожеланиями!

+0

У меня нет 'ubunto'. –

+1

Привет. Добро пожаловать в SO! Ваш вопрос, вероятно, будет закрыт из-за недостаточной информации. Пожалуйста, используйте отладчик, чтобы сузить проблему до определенной строки кода. –

+3

Первым распределением должно быть 'malloc (ordem * sizeof (int *))'. – Barmar

ответ

1
int **me; 
me = malloc(ordem * sizeof(int)); 

вот ошибка! Это:

me = malloc(ordem * sizeof(int*)); 

Всегда дважды проверить таНос, 90% Segfault Comme отсюда ...

0

Когда вы выделяете массив указателей, вам нужно взять размер элемента указателя, а не int. В вашей системе Ubuntu размер указателя, вероятно, составляет 64 бит, тогда как ints все еще 32, а в Windows оба имеют тот же размер, что и в традиционном случае.

+0

@Adarsh: мир не заканчивается на x86. –

+0

@ DanielKamilKozar Это потенциально неправильно даже там. Его Ubuntu, вероятно, работает на 64-битной производной от x86. –

+0

Извините @Peter обновил свой пост позже. Извини за это. – Adarsh

1

Ваш вопрос, вероятно, на линии

me = malloc(ordem * sizeof(int)); 

me является int**, так вам необходимо выделить int*, а не int.

Это дает вам проблемы с переносимостью, поскольку разные компиляторы не обязательно используют один и тот же размер для этих типов данных. Попробуйте запустить этот код на разных машинах, чтобы проверить, что происходит.

printf("The size of an int is %d\n", sizeof(int)); 
printf("The size of an int* is %d\n", sizeof(int*)); 

Таким образом, что вы можете изменить свой стиль кодирования, так что эта ошибка труднее сделать это, чтобы использовать имя переменной в вашем SizeOf как так

me = malloc(ordem * sizeof(*me)); 

Таким образом, вы можете визуально видеть, что вы выделяют пространство для ordem переменных типа me указывает на.