C: bei der Initialisierung eines dynamischen Arrays innerhalb einer Struktur
Bin ich zu versuchen, meine eigenen basic-version der matrix-Multiplikation in C und basierend auf einem anderen Umsetzung, ich habe einen matrix-Datentyp. Der code funktioniert, aber ein C-Anfänger, ich verstehe nicht, warum.
Das Problem: Die habe ich ein struct mit einem dynamischen array drin und ich bin der Initialisierung der Zeiger. Siehe unten:
//Matrix data type
typedef struct
{
int rows, columns; //Number of rows and columns in the matrix
double *array; //Matrix elements as a 1-D array
} matrix_t, *matrix;
//Create a new matrix with specified number of rows and columns
//The matrix itself is still empty, however
matrix new_matrix(int rows, int columns)
{
matrix M = malloc(sizeof(matrix_t) + sizeof(double) * rows * columns);
M->rows = rows;
M->columns = columns;
M->array = (double*)(M+1); //INITIALIZE POINTER
return M;
}
Warum muss ich das array initialisiert werden (double*)(M+1)? Es scheint, dass auch (double*)(M+100) funktioniert ok, aber z.B. (double *)(M+10000) funktioniert nicht mehr, wenn ich meine matrix-Multiplikation Funktion.
- Bitte: deklarieren Sie nicht zwei Arten in einem typedef verstecken sich nicht ein Zeiger-Typ in einem typedef, nicht mit Namen mit _t, Sie sind reserviert von POSIX, und verwenden Sie
size_t
fürrows
undcolums
. - Nein,
_t
ist nicht reserviert für POSIX. Es ist eigentlich nicht reserviert für irgendwas. Obwohl, man sollte es nur verwenden, die in Typ-Namen.size_t
ist nicht POSIX-zum Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
M+1
Punkte auf den Speicher, der sofort folgtM
(d.h. nach den zweiint
und diedouble*
). Dies ist der Speicher, den Sie haben, reserviert für die matrix-Daten:Mit
M+100
oderM+10000
und dann versuchen, füllen die matrix wird in Folge Undefiniertes Verhalten. Dies könnte dazu führen, dass ein Programm abstürzt oder ein Programm, die zu funktionieren scheint (aber in Wirklichkeit defekt ist), oder irgendetwas dazwischen.Ist die empfohlene Methode für diese Art von Sachen ist ohne Größenangabe-array in Verbindung mit
offsetof
. Es sorgt für die richtige Ausrichtung.matrix* A = new_matrix(3, 2); double amatrix[] = { 3, 2, 8, 1, 9, 2 }; A->array = amatrix;
aber das funktioniert nicht mehr.memcpy()
.Müssen Sie es initialisieren, da sonst (denn es warten) es ist nicht initialisierte!
Und Sie nicht verwenden können, einen nicht initialisierten Zeiger für nichts, außer zu generieren Undefiniertes Verhalten.
Initialisieren zu
M + 1
ist genau richtig und sehr guten code. Jeder andere Wert nicht den Speicher verwenden, der Sie zugeordnet, die für genau diesen Zweck.Mein Punkt ist, dass die
double *
am Ende der Struktur wird nicht "automatisch" Punkt, an diese Erinnerung, das ist die implizite überzeugung, die in Ihrer Frage, warum sollte es initialisiert werden. Also, es muss auf die richtige Adresse.