Wie bestimme ich die Größe meines Arrays in C?
Das heißt, die Anzahl der Elemente, die das Array aufnehmen kann?
Wie bestimme ich die Größe meines Arrays in C?
Das heißt, die Anzahl der Elemente, die das Array aufnehmen kann?
Seltsam, dass der Code size_t size_of_element
dennoch int
con int n = sizeof (a) / sizeof (a[0]);
und nicht size_t n = sizeof (a) / sizeof (a[0]);
Hallo @Yogeesh H T, können Sie bitte den Zweifel von chux beantworten. Ich bin auch sehr neugierig zu wissen, wie int n=sizeof(a)/sizeof(a[0]) die Länge des Arrays angibt und warum wir nicht size_t für die Länge des Arrays verwenden. Kann mir das jemand beantworten?
@Brain sizeof(a) gibt sizeof aller Elemente in Array a sizeof(a[0]) gibt sizeof des ersten Elements. Angenommen a = {1,2,3,4,5}; sizeof(a) = 20Byte (wenn sizeof(int)= 4Byte multipliziert mit 5), sizeof(a[0]) = 4Byte, also 20/4 = 5, d.h. Anzahl der Elemente
Abhängig von der Art array
hat, brauchen Sie nicht zu verwenden sizeof(array) / sizeof(array[0])
si array
ist ein Array aus entweder char
, unsigned char
ou signed char
- Zitat aus C18,6.5.3.4/4: "Wenn sizeof auf einen Operanden vom Typ char, unsigned char oder signed char (oder eine qualifizierte Version davon) angewendet wird, ist das Ergebnis 1." In diesem Fall können Sie einfach Folgendes tun sizeof(array)
wie in meinem Beitrag erklärt 回答 .
Wenn Sie dies wirklich tun wollen, um Ihr Array weiterzugeben, schlage ich vor, eine Struktur zu implementieren, um einen Zeiger auf den Typ zu speichern, von dem Sie ein Array wollen, und eine Ganzzahl, die die Größe des Arrays darstellt. Dann können Sie das an Ihre Funktionen weitergeben. Weisen Sie einfach den Wert der Array-Variable (Zeiger auf das erste Element) diesem Zeiger zu. Dann können Sie Array.arr[i]
um das i-te Element zu erhalten, und verwenden Sie Array.size
um die Anzahl der Elemente im Array zu ermitteln.
Ich habe einen Code für Sie eingefügt. Er ist nicht sehr nützlich, aber Sie könnten ihn um weitere Funktionen erweitern. Um ehrlich zu sein, wenn dies die Dinge sind, die Sie wollen, sollten Sie aufhören, C zu benutzen und eine andere Sprache mit diesen Funktionen verwenden.
/* Absolutely no one should use this...
By the time you're done implementing it you'll wish you just passed around
an array and size to your functions */
/* This is a static implementation. You can get a dynamic implementation and
cut out the array in main by using the stdlib memory allocation methods,
but it will work much slower since it will store your array on the heap */
#include <stdio.h>
#include <string.h>
/*
#include "MyTypeArray.h"
*/
/* MyTypeArray.h
#ifndef MYTYPE_ARRAY
#define MYTYPE_ARRAY
*/
typedef struct MyType
{
int age;
char name[20];
} MyType;
typedef struct MyTypeArray
{
int size;
MyType *arr;
} MyTypeArray;
MyType new_MyType(int age, char *name);
MyTypeArray newMyTypeArray(int size, MyType *first);
/*
#endif
End MyTypeArray.h */
/* MyTypeArray.c */
MyType new_MyType(int age, char *name)
{
MyType d;
d.age = age;
strcpy(d.name, name);
return d;
}
MyTypeArray new_MyTypeArray(int size, MyType *first)
{
MyTypeArray d;
d.size = size;
d.arr = first;
return d;
}
/* End MyTypeArray.c */
void print_MyType_names(MyTypeArray d)
{
int i;
for (i = 0; i < d.size; i++)
{
printf("Name: %s, Age: %d\n", d.arr[i].name, d.arr[i].age);
}
}
int main()
{
/* First create an array on the stack to store our elements in.
Note we could create an empty array with a size instead and
set the elements later. */
MyType arr[] = {new_MyType(10, "Sam"), new_MyType(3, "Baxter")};
/* Now create a "MyTypeArray" which will use the array we just
created internally. Really it will just store the value of the pointer
"arr". Here we are manually setting the size. You can use the sizeof
trick here instead if you're sure it will work with your compiler. */
MyTypeArray array = new_MyTypeArray(2, arr);
/* MyTypeArray array = new_MyTypeArray(sizeof(arr)/sizeof(arr[0]), arr); */
print_MyType_names(array);
return 0;
}
Am besten ist es, wenn Sie diese Informationen zum Beispiel in einer Struktur speichern:
typedef struct {
int *array;
int elements;
} list_s;
Implementieren Sie alle notwendigen Funktionen wie Erstellen, Zerstören, Gleichheit prüfen und alles andere, was Sie brauchen. Es ist einfacher, sie als Parameter zu übergeben.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
6 Stimmen
Zur Typensicherheit siehe stackoverflow.com/questions/19452971/array-size-macro-that-rejects-pointers
0 Stimmen
Eine Antwort ist Gegenstand von eine Metafrage .
1 Stimmen
Wenn die Antworten keinen Sinn ergeben, denken Sie daran, dass beim Kompilieren von C in Assembler die Größeninformation des Arrays verloren geht. Wenn Sie etwas deklarieren wie
int foo[5];
dass 5 nirgendwo in Ihrer kompilierten ausführbaren Datei erscheint.