2015-03-22 2 views
-3

Я работаю над этим 2 днями и не могу найти свои ошибки, программа запускается, но она останавливается (ждет) после ввода 3 или 4. кто-нибудь может помочь я где мои ошибки, пожалуйста?проблемы с указателями на C, не могу найти мои ошибки

Программа должна выполнить следующие действия:

Пользователь будет предложено сколько чисел он хочет войти (3 или 4). 3 или 4 целых значения будут введены пользователем и сохранены внутри массива. Программа подсчитывает, сколько нулей введено пользователем. Затем программа удваивает массив до двойного размера, где каждый элемент имеет свою копию рядом с ним. Распечатайте новый массив в конце.

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

static int cnt = 0; 


/* Read <cnt> Integers into given array. 
Return number of entered zeros */ 
int* readInts(int *arr) { 
    int i=0, *zeros = (int*)malloc(sizeof(int)); 

    while(i <= cnt) { 
     scanf("%d", arr++); 
     if (arr[i++] == 0) *zeros++; 
    } 
    return zeros; 
} 

/* Create "double-sized" copy of array (duplicate each value)*/ 
void extend(int *arr, int *newarr) { 
    int i,j; 
    newarr = (int*) malloc(2 * cnt * sizeof(int*)); 
    for (i=0,j=0; i <= cnt; i++) { 
     newarr[j++] = arr[i]; 
     newarr[j++] = arr[i]; 
    } 
} 

int main(void) 
{ 
    int arr[4], *zeros, i; 
    printf("How many integers (3 or 4)?\n"); 
    scanf("%d", &cnt); 

    zeros = readInts(arr); 
    printf("You entered %d zero(s)!\n", *zeros); 

    int *newarr; 
    extend(arr, newarr); 

    for (i=0; i < cnt*2; i++) printf("%d ", newarr[i]); 
    printf("\n"); 

    return 0; 
} 
+0

Вместо того, чтобы запрашивать ответы, это может быть полезно прочитать для вас: http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ –

ответ

1

Это потому, что вы используете while(i <= cnt), когда он должен быть while(i < cnt) (дважды).

Но после этого вы получите ошибку сегментации.
Вы передаете newarr в extend перед тем, как присвоить ему значение.
Внутри extend присвоить ему значение, но это не меняет вне функции, так что вы (скорее всего) ударил ошибку сегментации на printf("%d ", newarr[i]);
Кроме того, вы должны заменить int* на int в malloc(2 * cnt * sizeof(int*));. Но чтобы избежать ошибки сегментации, у вас есть два простых варианта (OFC есть много более сложные):

  1. Initialise newarr перед передачей его extend:
    int *newarr = (int*) malloc(2 * cnt * sizeof(int));
  2. Изменение void extend(int *arr, int *newarr)
    в int* extend(int *arr) и только return newarr; в конце extend.
+0

'readInts' is также неверно: 'arr ++' должен быть 'arr + i'. –