2016-04-09 10 views
0

Мне нужна помощь. Моя программа вылетает, когда я пытаюсь ввести данные и сохранить их указателю. Я могу успешно вводить данные в первый элемент динамического массива, я даже могу распечатать эти данные. Однако после этого, когда я пытаюсь ввести второй элемент, моя программа сработает. Отладчик не показывает никаких ошибок или предупреждений.Проблемы с указателями в функции

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

static const char SPRTR[] = "//---------------------------------------------------------------------------//"; 
static const char ERR_MSG[] = "ERROR! Try again."; 

void create_array(int **data, int *n, int *arr_max) 
{ 
    int i; 
    int err; 
    char temp; 

    do 
    { 
     err = 0; 
     printf("\nMaximum number of array elements: "); 
     if (((scanf("%d", arr_max)) < 1) || (*arr_max <= 0)) 
     { 
      printf("%s\n", ERR_MSG); 
      err = 1; 
     } 
     printf("\n%s\n", SPRTR); 
     while ((temp = getchar()) != '\n' && temp != EOF); 
    } while (err != 0); 

    do 
    { 
     err = 0; 
     printf("\nNumber of array elements (max. %d): ", *arr_max); 
     if (((scanf("%d", n)) < 1) || (*n > *arr_max) || (*n <= 0)) 
     { 
      printf("%s\n", ERR_MSG); 
      err = 1; 
     } 
     printf("\n%s\n", SPRTR); 
     while ((temp = getchar()) != '\n' && temp != EOF); 
    } while (err != 0); 

    *data = (int *) malloc(sizeof(int) * (*n)); 

    for (i = 0; i < *n; i++) 
    { 
     do 
     { 
      err = 0; 
      printf("\nValue of %d array element: ", i); 
      if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 
      { 
       printf("%s\n", ERR_MSG); 
       printf("\n%s\n", SPRTR); 
       err = 1; 
      } 
      while ((temp = getchar()) != '\n' && temp != EOF); 
     } while (err != 0); 
    } 
} 

int main() 
{ 
    int n; 
    int arr_max; 
    int *data; 

    create_array(&data, &n, &arr_max); 

    return 0;  
} 
+0

Отладчик ........................ .... –

ответ

1

Ваш компилятор (и мое) не находят ошибки, потому что вы используете правильные типы, но есть две ошибки (на самом деле в два раза же ошибка) в этом заявлении:

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 

data указатель (адрес) на ваш int *, содержащий результат вашего malloc. Таким образом, int s, к которым вы можете иметь доступ, являются (*data)[i] и их адреса: *data + i. Поэтому эту линию следует заменить на:

if (((scanf("%d", *data + i)) < 1) || ((*data)[i] < 0)) 

По крайней мере, это работает для меня.

+0

спасибо. Это было действительно полезно, потому что я новичок в языке C (и в общем программировании), и иногда указатели и адреса могут сбивать меня с толку. –

0

Проблема, кажется, с линией

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 

Вы должны разыменованиями данных, чтобы получить указатель на текущий элемент , а затем добавить смещение, вместо этого вы разыменования места, которое не является указателем самого массива.

Попробуйте заменить * (данные + I) с * данными + я так тогда, если оператор становится:

if (((scanf("%d", *data + i)) < 1) || ((*(*data + i)) < 0)) 

Также * (* данные + я)) просто получить смещение массива, так это может быть заменено на (* данные) [i], поэтому инструкция if будет:

if (((scanf("%d", *data + i)) < 1) || ((*data)[i] < 0)) 
Смежные вопросы