Forum: Compiler & IDEs Problem mit Malloc


von Sören T. (stimmy)


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
}

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Erklär erst mal, was das Programm machen soll.

Nebenbei testet Du Werte die noch gar nicht bestimmt sind
(zB if(!prim[i]), woher stammt der Wert ?

von Hartmut (Gast)


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.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Hartmut schrieb:
> hier wird in eine Variable geschrieben für die noch kein Speicherplatz
> definiert ist, einfach "=0" weg lassen;

Da wird ein Pointer (unnötigerweise) auf NULL initialisiert.

von K19 (Gast)


Lesenswert?

Du solltest das Feld prim erst mal mit den Werten 1 bis size-1 
füllen....

von Sören T. (stimmy)


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

von Di P. (drpepper) Benutzerseite


Lesenswert?

Dein Code läuft bei mir, wenn ich in per Copy und Paste nehme und mit 
GCC compiliere.

EDIT: auch mit malloc

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Na Prima !

Noch etwas: Es schadet nicht, am Ende der Funktion prims() dem
Speicher wieder freizugeben ;)

calloc() initialisiert das Array mit 0 ...

von PittyJ (Gast)


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.

von Karl H. (kbuchegg)


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?

von Fred (Gast)


Lesenswert?

Karl Heinz schrieb:
> wo wird der Speicher wieder freigegeben?

In der entsprechenden Routine des Betriebssystems beim Beenden des 
Programms. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.