2015-01-11 5 views
0
#include <stdio.h> 
#include <stdlib.h> 

main(){ 
    int *ptr,r,c,i,j,min; 
    printf("Give me the size of rows and columns\n"); 
    scanf("%d%d",&r,&c); 
    int mini[r]; 
    ptr=(int*)malloc(r*c*sizeof(int)); 
    if(ptr== NULL){ 
     printf("Memory not allocated"); 
    } 
    else{ 

     for(i=0;i<r;i++){ 
      for(j=0;j<c;j++){ 
      printf("Give me the value "); 

      scanf("%d",&ptr+(i*c+j)); 
      } 
     } 

     for(i=0;i<r;i++){ 
      min=*(ptr+i*c); 
      for(j=0;j<c;j++){ 
       if (*(ptr+i*c)<min){ 
        min = *(ptr+i*c); 
       } 
       mini[i]=min; 
      } 
     } 
     for(i=0;i<r;i++){ 
      printf("%d",mini[i]); 

     } 
     free(ptr); 

    } 
} 

Он получает значения строк и столбцов (r и c) без проблем, но он сбой, как только я доберусь до точки выделения выделенных элементов памяти. Например, если я установил r==3 и c==4, тогда он получает запрос на 10-й элемент из 12, а затем он выдает сообщение о том, что файл filename.exe перестает работать.Динамическое распределение, не подлежащее сканированию Номер

Из моего опыта я думаю, что это как-то связано с функцией scanf(). Я также пробовал без & в scanf, scanf("%d",ptr +(i*c +j)), но затем он падает, как только он считывает первый элемент.

В другой гораздо более простой программе, которую я написал, чтобы проверить ее, последний сценарий scanf() не представляет проблем, и программа работает так, как предполагалось.

+2

'если (PTR = NULL) {' это задание, а не сравнение, поэтому, я думаю, у вас есть некоторые опечатки, так как код, о котором вы говорите, не может выполнить иначе. Пожалуйста, исправьте их. – lared

+0

Вы правы, спасибо – SokCEID

ответ

0

Это неправильно

scanf("%d",&ptr+(i*c+j)); 

должно быть

scanf("%d", &(*(ptr + i*c + j))); 

или так, что ptr указывает на Адресная, вы не должны разыменования указателя, а затем передать адрес, просто

scanf("%d", ptr + i*c + j); 

В вашем коде вы указываете адрес указателя ptr увеличивается на i * c + j, что, предположительно, неверный адрес, и, следовательно, возникает ошибка сегментации.

Кроме того, это не первый раз, когда я вижу scanf(), где возвращаемое значение игнорируется, если вы введете строку, тогда произойдет сбой.

Вы должны убедиться, что число было прочитано с

if (scanf("%d", &(*(ptr + i * c + j))) == 1) 

если условие ложно, то значение не было прочитано, если вы вводите текст вместо цифр.

+1

Разве это не прекрасная возможность показать OP как правильно * индексировать массивы? – usr2564301

+1

хорошо '& (* (...))' обязательно есть какой-то юмор! –

+0

Это просто, чтобы сообщить ему, что синтаксис, который он пытался, неверен, хотя есть правильный способ написания аналогичного синтаксиса, это не лучший способ, конечно, но это не так. –

0
scanf("%d",&ptr+(i*c+j)); 

является опасным!

&ptr* содержит адрес указателя на первый элемент ptr, а не адрес первого элемента!

Вам нужно просто ptr + (i*c +j), или &(ptr[i*c+j]).

+0

Большое спасибо, что была ошибкой, теперь он гладко идет :) – SokCEID

0

Во втором scanf()"%d" ожидает формат типа int* т.е. указателя, но я вижу, что вы передаете адрес указателя, как &ptr+(i*c+j), который int**

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

  • Нет связанных вопросов^_^