2016-04-09 17 views
0

Yardımıma ihtiyacım var. Verileri girmeye ve bir işaretçiye kaydetmeye çalıştığımda programım çöküyor. Verileri dinamik dizinin ilk elemanına başarılı bir şekilde girebilirim, hatta bu verileri yazdırabilirim. Ancak, bundan sonra, ikinci elemanı girmeye çalıştığımda programım çöküyor. Hata ayıklayıcı herhangi bir hata veya uyarı göstermiyor.Bir işlevdeki işaretçilerle ilgili sorunlar

#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

Debugger ........................ .... –

cevap

1

Sizin derleyici (ve ayrıca maden) Doğru türlerini kullanmak, henüz iki hataları (aslında iki kez aynı hata) bu açıklamada olduğundan hataları bulmuyorum:

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

dataint * numaranıza malloc sonucunu gösteren işaretçi (adres). (*data)[i] adresinden erişebileceğiniz int s adresleri ve adresleri *data + i'dır. Yani bu satır aşağıdaki gibi değiştirilmelidir:

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

En azından benim için çalışır.

+0

Teşekkür ederim. Bu gerçekten yardımcı oldu çünkü C dili (ve genel programlama) için yeniyim ve bazen işaretçiler ve adresler benim için kafa karıştırıcı olabilir. –

0

sorun hattıyla gibi görünüyor

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0)) 
yerine size bir işaretçi olmayan bir konuma KQUEUE, şimdiki eleman işaretçiyi elde etmek verileri dereferencing ve sonra ofset ekleyerek olmalıdır

dizinin kendisi.

değiştirilmesi Dene verileriyle * (veri + i) + i böylece daha sonra açıklamada olursa:

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

* (* veri + i) ') sadece elde dizinin ofset bu nedenle bu eğer tablosunu olur [i], yani (* verileri) ile ikame edilebilir:

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