Dies ist möglich, indem das Array in eine struct
verpackt wird. Sie können ein Feld für die Größe des Arrays einfügen, so dass Sie diesen Parameter nicht explizit übergeben müssen. Dieser Ansatz hat den Vorteil, dass zusätzliche Speicherzuordnungen vermieden werden, die später freigegeben werden müssen.
C übergibt bereits Argumente an Funktionen nach Wert, aber Arraybezeichner zerfallen in den meisten Ausdrücken und insbesondere in Funktionsaufrufen zu Zeigern. Doch struct
s zerfallen nicht in Zeiger und werden als Wert an eine Funktion übergeben, was bedeutet, dass eine Kopie der ursprünglichen Struktur und aller ihrer Inhalte im Gültigkeitsbereich der Funktion sichtbar ist. Wenn die struct
ein Array enthält, wird dies ebenfalls kopiert. Beachten Sie, dass der Zeiger stattdessen kopiert wird, wenn die struct
an die Funktion übergeben wird, aber derselbe Speicher von der Kopie und dem ursprünglichen Zeiger referenziert wird, wenn stattdessen struct
einen Zeiger auf int
für ein dynamisches Array enthält.Dieser Ansatz basiert auf dem struct
, der ein tatsächliches Array enthält.
Beachten Sie auch, dass struct
kein Mitglied mit einem unvollständigen Typ enthalten kann und daher kein VLA enthalten kann. Hier habe ich die globale Konstante MAX_ARR
als 100 definiert, um etwas Platz für die Handhabung unterschiedlich großer Arrays mit demselben Typ struct
zu schaffen.
Sie können auch eine struct
von einer Funktion zurückgeben. Ich habe ein Beispiel eingefügt, das die Array
struct
modifiziert, die in eine Funktion übergeben wird, und die modifizierte struct
zurückgibt, die einem anderen Array
struct
in der aufrufenden Funktion zugewiesen wird. Dies führt dazu, dass der Aufrufer sowohl auf das ursprüngliche als auch das transformierte Array zugreifen kann.
#include <stdio.h>
#define MAX_ARR 100
struct Array {
size_t size;
int array[MAX_ARR];
};
void print_array(struct Array local_arr);
void func(struct Array local_arr);
struct Array triple(struct Array local_arr);
int main(void)
{
struct Array data = {
.size = 10,
.array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
};
struct Array transformed_data;
func(data);
transformed_data = triple(data);
printf("Original\n");
print_array(data);
printf("Transformed\n");
print_array(transformed_data);
return 0;
}
void print_array(struct Array local_arr)
{
for (size_t i = 0; i < local_arr.size; i++) {
printf("%5d", local_arr.array[i]);
}
putchar('\n');
}
void func(struct Array local_arr)
{
for (size_t i = 0; i < local_arr.size; i++) {
local_arr.array[i] *= 2;
}
printf("Modified\n");
print_array(local_arr);
}
struct Array triple(struct Array local_arr)
{
for (size_t i = 0; i < local_arr.size; i++) {
local_arr.array[i] *= 3;
}
return local_arr;
}
Programmausgabe:
Modified
2 4 6 8 10 12 14 16 18 20
Original
1 2 3 4 5 6 7 8 9 10
Transformed
3 6 9 12 15 18 21 24 27 30
Sie können es in einer Struktur wickeln, aber das ist ein bisschen wie ein Hack. Warum nicht 'memcpy' in' Foo' verwenden? – Ryan
"*' // nimmt ein Integer Array arr als Argument an "*" Nun, nein, in der Tat braucht es ein 'int *'. Im Zusammenhang mit der Definition von Funktionsargumenten ist "T t []" äquivalent zu "T * t". – alk