2016-04-24 10 views
0

Ich versuche zu verstehen, wie malloc und pointer funktioniert.Ändern der Adresse des mit malloc erstellten Zeigers

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    int *p; 
    int b = 15; 
    p = (int *)malloc(sizeof(int) * 10); 
    for (int i = 0; i < 5; i++) { 
     p + i = &b; 
    } 
} 

Der obige Code gibt Fehler Ausdruck nicht belegbar ist p + i = & b;

Soweit ich verstehe, gibt malloc die Startadresse des Speichers in Heap zugeordnet, die ich typecast, um die Adresse von Ganzzahlen zu halten. Technisch gesehen sollte p + i eine Integer-Adresse enthalten können, aber der Code wirft einen Fehler auf. Kannst du mir bitte erklären, warum das falsch ist?

Dank

+4

Meinst du '* (p + i)'? (Oder vielleicht 'p [i]'?) –

+2

Größere Verwirrung hier, Erstens, 'p + i' ist ein Ausdruck, der kein ** l-Wert ** sein kann. Zweitens kann der Speicher, auf den "p + i" zeigt, integer halten, was mit '* (p + i)' gemacht werden kann, aber Sie versuchen, ihn 'int *' zu halten. – Haris

+0

Korrigieren Sie mich, wenn ich falsch liege. int b = 25; int * a = & b; int c = 50; a = & c. Wenn der obige Code funktioniert, warum funktioniert der von malloc in der Frage zugewiesene nicht. Der Speicher, auf den p + i zeigt, kann ganzzahlig sein. Warum kann ich dann nicht p + i ändern, um auf die Adresse einer ganzen Zahl zu zeigen? –

Antwort

0

Die Codezeile p = (int *)malloc(sizeof(int) * 10); bedeutet, dass der Zeiger p um die Adresse des ersten Elements des dynamisch zugewiesenen Array mit malloc() zugeordnet ist, die eine int Array von 10 Elementen, bestehend zugewiesen hat.

Wenn Sie 5 dieser Elemente zuweisen den Wert b dann schreiben Sie:

for (int i = 0; i < 5; i++) { 
    p[i] = b; 
} 

Wenn Sie jedoch eine Reihe von 10 Integer-Zeiger wollen und 5 von ihnen zuweisen die Adresse b, dann schreiben Sie:

int **pointer = (int **)malloc(sizeof(int *) * 10); 
for (int i = 0; i < 5; i++) { 
    pointer[i] = &b; 
} 

nicht dynamisch zugewiesenen Speicher frei vergessen Sie, wenn Sie fertig sind.

0

p + i zeigt auf eine Adresse in Ihrem Speicher, das gleiche wie &(p[i]). Sie können die Adresse des Speichers nicht ändern, deshalb sagt der Compiler, dass der Ausdruck nicht zuweisbar ist.

Wenn Sie eine int unter dieser Adresse speichern möchten, müssen Sie *(p+i) = b verwenden.

Aber wenn Sie die Adresse eines int speichern möchten Sie ein Array benötigen, die int* hält, so müssen Sie p als int** erklären und seinen Speicher mit dem sizeof(int*) zuzuordnen. So würde Ihr Code wie folgt aussehen:

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    int **p; 
    int b = 15; 
    p = (int**)malloc(sizeof(int*) * 10); 
    for (int i = 0; i < 5; i++) { 
     *(p + i) = &b; 
    } 
} 
Verwandte Themen