2013-11-16 3 views
1

Что я здесь сделал неправильно? Он падает после ввода count, а затем моего массива Это должно быть что-то с распределением памяти, но я пробовал много вещей, и никто из них не помогал. спасибо за ответ хрустального шарападает после ввода

struct _arr { 
    size_t count; 
    int* arr; 
}; 

typedef struct _arr array_t; 

array_t array_create(int* arr, size_t count){ 
    array_t* newArr; 

    newArr = (array_t*)malloc(sizeof(count)+sizeof(int)*count); 
    newArr->count = count; 
    newArr->arr = arr; 
    return *newArr; 
} 


array_t array_get(FILE* file){ 
    int* arr = NULL; 
     size_t count; 
    array_t arr_t; 
    int i = 0; 

    if (!file) return; 
    if (!fscanf(file, "%u", &count)) return; 
    arr_t = array_create(arr, count); 

    for (i = 0; i < arr_t.count; i++){ 
     if (!fscanf(file, "%d", &arr_t.arr[i])) return; 
    } 

    for (i = 0; i<arr_t.count; i++) 
    printf("%d ", arr_t.arr[i]); 
    printf("\n"); 

    return arr_t; 
} 


int main(){ 
    array_t arr; 
    int i = 0; 

    arr = array_get(stdin); 

    for (i = 0; i<arr.count; i++) 
     printf("%d ", arr.arr[i]); 

    getch(); 
    return 0; 
} 
+3

Если вы думаете, что 'array_create()', удобно опущенный из опубликованного источника, как-то незначительно и не имеет ничего общего с вашей проблемой, вы, вероятно, ошибаетесь. Отправьте его. – WhozCraig

+3

Ваша функция иногда ничего не возвращает, не компилирует ли ваш компилятор об этом? –

+0

@CharlieBurns выдающийся улов. отступы и однострочная if-logic полностью скрывали это от моих усталых глаз. – WhozCraig

ответ

3

WhozCraig говорит ваша проблема в array_create(). В частности, поле arr не распределено должным образом. Ваш array_create() должен выглядеть примерно так:

array_t array_create(int length) 
{ 
    array_t res = {length, NULL}; 
    if (length > 0) { 
     res.arr = malloc(length * sizeof(*res.arr)); 
     if(res.arr == NULL) { 
      printf("malloc(%d) failed\n", length * sizeof(*res.arr)); 
      exit(1); 
     } 
    } 
    return res; 
} 

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


обновление пн 18 ноября 16:13:48 CST 2013

Это совершенно другая версия, которая выделяет array_t из кучи. Обработка ошибок является отвратительной (все те места, которые возвращают 0;). Это должно сработать, другой тоже работал, но, возможно, array_t в куче - это то, что вы ищете.

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

typedef struct { 
    size_t count; 
    int *arr; 
} array_t; 

array_t *array_create(size_t count){ 
    array_t *newArr = malloc(sizeof(array_t)); 
    if(newArr == 0) return 0; 
    newArr->count = count; 
    newArr->arr = calloc(sizeof(int),count); 
    if(newArr->arr == 0) return 0; 
    return newArr; 
} 

array_t *array_get(FILE* file){ 
    size_t count; 
    array_t *arr; 
    int i = 0; 

    if (!file) return 0; 
    if (!fscanf(file, "%zu", &count)) return 0; 
    arr = array_create(count); 
    if(arr == 0) return 0; 

    for (i = 0; i < arr->count; i++){ 
     if (!fscanf(file, "%d", &arr->arr[i])) return 0; 
    } 

    for (i = 0; i<arr->count; i++) 
     printf("%d ", arr->arr[i]); 
    printf("\n"); 

    return arr; 
} 


int main(void) { 
    array_t *arr; 
    int i = 0; 

    arr = array_get(stdin); 
    if(arr == 0) return -1; 

    for (i = 0; i<arr->count; i++) 
     printf("%d ", arr->arr[i]); 

    getch(); // getch is windows 
    return 0; 
} 
+0

Мы * имеем *, чтобы опубликовать версию, которая работает. Мы не можем просто сказать *, что * (хотя я усмехнулся, когда увидел, что он всплывает, чтобы быть уверенным). – WhozCraig

+0

Я удалю, если вы хотите ... У меня было «шары» множественной ошибки. Это звучало как-то нехорошо. –

+1

Как в: 'мои шары чувствуют себя как пара марака '? – wildplasser

0

Согласно мне, вы пытаетесь вернуть значение, которое присутствует на этом адресе, указав указатель. так просто просто вернуть newArr

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