Wie finden Sie die 'sizeof' (ein Zeiger auf ein array)?
First off, hier sind einige code:
int main()
{
int days[] = {1,2,3,4,5};
int *ptr = days;
printf("%u\n", sizeof(days));
printf("%u\n", sizeof(ptr));
return 0;
}
Ist es ein Weg, um herauszufinden, die Größe des Arrays, die ptr
verweist (anstatt nur unter Angabe Ihrer Größe, der vier bytes auf einem 32-bit system)?
Ich habe immer verwendet parens mit dem sizeof - sicher, es macht es Aussehen wie eine Funktion aufrufen, aber ich denke, es ist klarer.
Warum nicht? Tun Sie etwas gegen die überflüssigen Klammern? Ich denke, es liest sich ein wenig leichter mit Ihnen selbst.
gut .. vorausgesetzt der linken Seite dieser call ist ein Zeiger auf int, ich würde es schreiben als int *ptr = malloc(4 * sizeof *ptr); die ist mir weitaus klarer. Weniger parens zu Lesen, und bringt die wörtliche constsant auf der Vorderseite, wie in der Mathematik.
nicht alloziert ein array von Zeigern, wenn Sie eigentlich ein array von ints!
Es gibt keine "Zeiger auf ein array" hier. Nur ein Zeiger auf ein int.
Warum nicht? Tun Sie etwas gegen die überflüssigen Klammern? Ich denke, es liest sich ein wenig leichter mit Ihnen selbst.
gut .. vorausgesetzt der linken Seite dieser call ist ein Zeiger auf int, ich würde es schreiben als int *ptr = malloc(4 * sizeof *ptr); die ist mir weitaus klarer. Weniger parens zu Lesen, und bringt die wörtliche constsant auf der Vorderseite, wie in der Mathematik.
nicht alloziert ein array von Zeigern, wenn Sie eigentlich ein array von ints!
Es gibt keine "Zeiger auf ein array" hier. Nur ein Zeiger auf ein int.
InformationsquelleAutor jkidv | 2009-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das können Sie nicht. Der compiler weiß nicht, was der Zeiger zeigt. Gibt es tricks, wie Ende das array mit einer bekannten out-of-band-Wert und dann zählen die Größe, die bis zu diesem Wert, aber das ist nicht mit sizeof.
Ein weiterer trick ist das man erwähnt Zan, die zum verstauen der Größe irgendwo. Zum Beispiel, wenn Sie die dynamische Zuweisung von array, reserviert einen block ein int größer als die, die Sie brauchen, verstauen Sie die Größe in der ersten int und return ptr+1 als Zeiger auf das array. Wenn Sie benötigen, die Größe, dekrementiert den Zeiger und Blick auf den verteilt-Wert. Denken Sie daran, kostenlos den ganzen block beginnend, und nicht nur das array.
da freie entdeckt die Größe zur Laufzeit. Der compiler kann nicht wissen, die Größe könnte man da machen, das array eine andere Größe-je nach Laufzeit-Faktoren (Kommandozeilen-Argumente, die Inhalte einer Datei, die phase des Mondes,etc).
Schnelle follow up, warum nicht gibt es eine Funktion, die die Größe zurückgeben, den Weg frei macht?
Gut, wenn Sie garantieren könnten, dass die Funktion nur aufgerufen, mit malloced Speicher und die Bibliothek verfolgt die malloced Speicher, wie die meisten, die ich gesehen habe zu tun (mit einem int-bevor der zurückgegebene Zeiger), dann könnten Sie schreiben. Aber wenn der Zeiger auf ein statisches array oder dergleichen, es würde scheitern. Ebenso gibt es keine Garantie, dass die Größe der malloced Speicher ist zugänglich auf Ihrem Programm.
Eine andere Sache im Auge zu behalten ist, dass die Größe erfasst, die durch die malloc/free system möglicherweise nicht die Größe, die Sie gefragt haben. Sie malloc 9 bytes und 16. Malloc 3K bytes und 4K bekommen. Oder in ähnlichen Situationen.
InformationsquelleAutor Paul Tomblin
Die Antwort ist "Nein".
Was C-Programmierer tun ist, speichern Sie die Größe des array irgendwo. Es kann Teil einer Struktur, oder kann der Programmierer schummeln ein bisschen und malloc() mehr Speicher als angefordert, um zu speichern, die Länge mit dem Wert vor dem Beginn des Arrays.
und anscheinend pascal-strings sind, warum excel läuft so schnell!
Es ist schnell. Ich verwende es in eine Liste von Zeichenketten, die Umsetzung von mir. Es ist super-schnell, lineare Suche, da ist es: laden Sie Größe, prefetch pos+Größe, vergleichen der Größe zu suchen, Größe, wenn Sie gleich sind, strncmp, weiter zur nächsten saite, wiederholen. Es ist schneller als die binäre Suche bis zu 500 strings.
InformationsquelleAutor Zan Lynx
Für dynamische arrays (malloc oder C++ neue) müssen Sie die Größe des array, wie von anderen erwähnt oder vielleicht bauen Sie einen array-manager-Struktur, die Griffe add, remove, count, etc. Leider ist C nicht dies tun fast so gut wie C++, da Sie im Grunde haben, es zu bauen, für jede andere array-Typ, den Sie speichern das ist umständlich, wenn Sie mehrere Arten von arrays, die Sie brauchen, um zu verwalten.
Für statische arrays, wie in deinem Beispiel, es gibt eine gemeinsame makro verwendet, um die Größe, aber es ist nicht empfohlen, als es sich nicht überprüfen, ob der parameter wirklich ein statisches array. Das makro verwendet wird, in echten code aber z.B. in den Linux-kernel-Header, obwohl es möglicherweise etwas anders aus als unten:
Können Sie google für Gründe, vorsichtig zu sein von Makros wie dieses. Seien Sie vorsichtig.
Wenn möglich, die C++ stdlib wie vector, die ist viel sicherer und einfacher zu verwenden.
Ja, es ist ein gemeinsames Paradigma. Sie noch brauchen, um verwenden Sie es vorsichtig, obwohl, wie es einfach ist zu vergessen und verwenden Sie es auf ein dynamisches array.
Ja, guter Punkt, aber die Frage war über die Zeiger, nicht das statische array.
Dass
ARRAY_SIZE
makro immer funktioniert, wenn dessen argument ist ein array (d.h. Ausdruck der array-Typ). Für Ihr so genanntes "dynamisches array", bekommt man nie eine wirkliche "array" (Ausdruck der array-Typ). (Natürlich, Sie können es nicht, da array-Typen sind Ihrer Größe zur compile-Zeit.) Sie bekommen nur ein Zeiger auf das erste element. Ihren Einwand "nicht überprüfen, ob der parameter wirklich ein statisches array" ist nicht wirklich gültig, da Sie anders sind als man ein array ist und der andere nicht.Es gibt eine template-Funktion im Umlauf, die nicht die gleiche Sache, aber wird verhindern, dass die Verwendung von Zeigern.
InformationsquelleAutor Ryan
Gibt es eine saubere Lösung mit C++ - templates, ohne sizeof(). Die folgenden getSize() Funktion gibt die Größe eines statischen Arrays:
Hier ist ein Beispiel mit einer foo_t Struktur:
Ausgabe:
T (&)[SIZE]
. Können Sie erklären, was das bedeutet? Auch könnte man erwähnen, constexpr in diesem Zusammenhang.Das ist schön, wenn du c++ verwendest und Sie haben tatsächlich eine variable, ein array-Typ. Keiner von beiden ist der Fall in der Frage: die Sprache ist C, und das, was der OP will, um die array-Größe ist ein einfacher Zeiger.
würde dieser code führt zu code aufblasen, indem Sie die Neuerstellung der gleiche code für jede andere Größe/Typ-Kombination oder ist das magisch optimiert Existenz durch den compiler?
Das ist C++ - syntax für eine Referenz von array-Typ (ohne Variablen-Namen, nur eine Größe und element-Typ).
Diese Funktion optimiert ist vollkommen Weg zur compile-Zeit, keine Magie notwendig ist; es ist nicht die Kombination, alles auf eine einzige definition, es ist einfach inlining Sie Weg, um einen compile-Zeit-Konstante. (Aber in einem debug-build, ja, Sie hatte einen Haufen von separaten Funktionen, die verschiedene Konstanten. Linker magic könnten diejenigen Zusammenführen, die die gleiche Konstante. Die Anrufer nicht passieren
SIZE
als arg, es ist ein template-param, muss schon bekannt sein durch die definition der Funktion.)InformationsquelleAutor skurton
Diesem Beispiel, ja, es ist, WENN Sie Typdefinitionen (siehe unten). Natürlich, wenn Sie es so machen, du bist einfach so gut zu verwenden SIZEOF_DAYS, da Sie wissen, was der Zeiger verweist.
Wenn Sie ein (void *) - Zeiger zurückgegeben wird, die durch malloc() oder ähnliches ist, dann Nein, es gibt keine Möglichkeit zu bestimmen, welche Daten die Struktur der Zeiger verweist, und somit keine Möglichkeit, Ihre Größe zu bestimmen.
Ausgabe:
InformationsquelleAutor David
Gibt es keine Magische Lösung. C ist nicht eine reflektierende Sprache. Objekte werden nicht automatisch wissen, was Sie sind.
Aber Sie haben viele Möglichkeiten:
InformationsquelleAutor DigitalRoss
Als alle richtigen Antworten angegeben haben, können Sie diese Informationen aus dem verfallenen Zeiger Wert des Arrays allein. Wenn das verfallene Zeiger ist das argument eingegangen, die von der Funktion, dann die Größe des ursprünglichen Arrays bereitgestellt werden muss, in anderer Form für die Funktion zu kommen, zu wissen, dass Größe.
Hier ist ein Vorschlag anders aus, was wurde zur Verfügung gestellt, so weit,dass es funktionieren wird: Übergeben wird ein Zeiger auf das array statt. Dieser Vorschlag ist ähnlich wie die C++ - Stil Vorschläge, außer dass C nicht unterstützt, Vorlagen oder Verweisungen:
Aber dieser Vorschlag ist eine Art von albern für dein problem, da die Funktion definiert ist, genau zu wissen, die Größe des Arrays, die übergeben wird (daher gibt es wenig Notwendigkeit zu verwenden, sizeof bei alle auf dem array). Was tut es tun, obwohl, ist bieten einige geben Sicherheit. Es untersagt Ihnen, von übergeben ein array von einer unerwünschten Größe.
Wenn die Funktion soll in der Lage sein zu arbeiten auf eine beliebige Größe des Arrays, dann müssen Sie die Größe, die der Funktion zusätzliche Informationen.
InformationsquelleAutor jxh
Meine Lösung für dieses problem ist das speichern der Länge des array in ein struct-Array als ein meta-Informationen über das array.
Aber Sie haben zu kümmern, legen Sie die richtige Länge des Arrays, die Sie speichern möchten, weil die keine Möglichkeit zu überprüfen, diese Länge, wie unsere Freunde Massiv erklärt.
InformationsquelleAutor
Größe der Tage[] ist 20 und ist keine der Elemente * Größe des Datentyps.
Während die Größe der Zeiger ist 4, egal was es verweist.
Da ein Zeiger verweist auf ein anderes element durch die Speicherung Ihrer Adresse.
InformationsquelleAutor Shivangi Chaurasia
Können Sie etwas wie das hier tun:
InformationsquelleAutor Tᴏᴍᴇʀ Wᴏʟʙᴇʀɢ
Nein, können Sie nicht verwenden
sizeof(ptr)
ermitteln Sie die Größe des arrayptr
verweist.Obwohl die Zuweisung zusätzlicher Speicher(mehr als die Größe des Arrays) wird hilfreich sein, wenn Sie wollen speichern Sie die Länge in extra Raum.
InformationsquelleAutor SKD
array_size ist, vorbei an der Größe variable:
Nutzung ist:
InformationsquelleAutor user3065147
hi in strings gibt es eine
'\0'
Charakter am Ende, so kann man die Größeeines Strings mit Funktionen wie
strlen
das problem mit einem integer-array zum Beispiel ist, dass u können nicht alle Wert als end-Wert, so dass eine mögliche Lösung ist die Adresse des Arrays und Verwendung als end-Wert derNULL
ZeigerErstellen Sie ein array von Zeigern auf jedes element, so können Sie linear-Suche für
NULL
ist wahrscheinlich die am wenigsten effiziente alternative denkbar, um nur die Speicherung einer separatensize
direkt. Vor allem, wenn Sie tatsächlich diese zusätzliche Schicht der Dereferenzierung die ganze Zeit.InformationsquelleAutor baz