Problem mit Malloc

OP #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.
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.