Problem mit Malloc

#3419351
Lesenswert?

Hallo,
ich habe heute versucht eine Funktion zu schreiben die in einem 
angegebenen Feld nach Primzahlen sucht.
Leider steht in der Console und ein leerer Cursor von getchar();

Hat einer eine Idee was falsch läuft?
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
int prims(int size)
5
{
6
  int i=2,j=0;  
7
  int *prim=0;
8

9
  prim =(int*) malloc(size* sizeof(int));
10
  if( NULL == prim ) printf("Fehler bei Speicherreservierung!\n");  
11

12
    for(i;i < size;i++)
13
    {
14
        if(!prim[i])
15
        {
16
            printf("%04i\n",i);
17

18
            for(j = 1;(j*i) < size;++j)
19
            {
20
                prim[(j*i)] = 1;
21
            }
22
        }
23
    }
24
  return 0;
25
}
26

27
int main(void)
28
{
29
    prims(1000);  
30
    getchar();
31
    return 0;
32
}
Gast #3419391
Lesenswert?

Hallo zusammen,

>int prims(int size)
>{
>  int i=2,j=0;
>  int *prim=0;
hier wird in eine Variable geschrieben für die noch kein Speicherplatz 
definiert ist, einfach "=0" weg lassen;

>if( NULL == prim ) printf("Fehler bei Speicherreservierung!\n");
hiernach sollte die Funktion abgebrochen werden sonst führt das 
nachfogende zu unberechenbaren Zuständen;

Gruß Hartmut.
#3419406
Lesenswert?

So es läuft...
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
int prims(int size)
5
{
6
  int i=2,j=0;  
7
  int *prim=(int*) calloc(size,sizeof(int));
8
  if( NULL == prim ) printf("Fehler bei Speicherreservierung!\n");  
9

10
    for(i;i < size;i++)
11
    {
12
        if(!prim[i])
13
        {
14
            printf("%04i\n",i);
15

16
            for(j = 1;(j*i) < size;++j)
17
            {
18
                prim[(j*i)] = 1;
19
            }
20
        }
21
    }
22
  return 0;
23
}
24

25
int main(void)
26
{
27
  int x;
28
  scanf("%d",&x);
29
  
30
  prims(x);  
31

32
    return 0;
33
}

Jetzt kann man die Größe des Feldes vorgeben und die Primzahlen werden 
ausgegegn.

Console mit Eingabe 50:
50
0002
0003
0005
0007
0011
0013
0017
0019
0023
0029
0031
0037
0041
0043
0047
Gast #3419423
Lesenswert?

Ist ja auch klar:
man calloc
..
calloc()  allocates memory for an array of nmemb elements of size bytes
       each and returns a pointer to the allocated memory.  The memory 
is  set to  zero.

       malloc() allocates size bytes and returns a pointer  to  the 
allocated memory.   The  memory  is  not  cleared.

Einmal ist der Speicher gelöscht, einmal steht evtl noch Müll drin.
In C also immer Speicher inititalisieren, bevor man ihn verwendet.
#3419499
Lesenswert?

Der Teil ist immer noch falsch
1
  if( NULL == prim ) printf("Fehler bei Speicherreservierung!\n");  
2

3
    for(i;i < size;i++)

wenn du von calloc keinen Speicher kriegst, dann KANN die Funktion nicht 
arbeiten. Es ist schön, wenn du eine Fehlermeldung ausgibst (die 
eigentlich der Aufrufer ausgeben sollte). Es ist aber nicht schön, wenn 
du danach einfach so weitermachst, als wäre nichts geschehen. Wenn du 
keinen Speicher kriegst, dann kann die Funktion auch nicht arbeiten. 
Punkt.

Und Speicher, den du allokierst, musst du auch wieder freigeben. Gewöhn 
dich daran. Auch bei derartigen Übungsbeispielen ist das nicht 
akzeptabel. Wenn du malloc oder calloc schreibst, ist das nächste was 
man sich überlegt: wo wird der Speicher wieder freigegeben?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren