Adresse von Array? Was sagt der Standard dazu?
-
Simon2 schrieb:
Immerhin haben die Zeiger andere Typen und im gleichen Schluss könnte man
struct A { char c; ... }; int main() { A a; memset(&a, 'a', 1); /* setze erstes Element */
nutzen (was bestimmt in ähnlich vielen Fällen funktioniert, aber hier wohl doch nicht als guter Stil angesehen wird).
Klar kann man das machen und es ist auch definiert, dass dies funktioniert. Es ist bloß schlechter Stil, weil unnötig kryptisch ohne Mehrgewinn.
Und es funktioniert natürlich nicht mehr für den zweiten Member von A.edit: Und da gleich bestimmt jemand behauptet, dass da Padding und Alignment eine Rolle spielen könnten:
C99 §6.7.2.1: schrieb:
12 Each non-bit-field member of a structure or union object is aligned in an implementation- defined manner appropriate to its type.
13 Within a structure object, the non-bit-field members and the units in which bit-fields reside have addresses that increase in the order in which they are declared. A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning.
-
Also man kann auf jedenfall allein über Zeiger durch ein ganzes Array navigieren. Habe das im Studium mal gemacht. Ich schau mal ob ich das noch finde
EDIT:
so zum zählen wie lang so nen ding ist:int laenge_p(char * array) { int zaehler = 0; for(array; *array; array++) zaehler++; return zaehler; }
Auf Grund des \0 bricht es hier auch allein ab. Bei einem int array bräuchte man wohl eine Abbruchbedingung.
-
Du musst dich im Thread geirrt haben.
-
hat man nicht ein ähnliches problem wenn man die adresse einer funktion haben will?
void xxx(){
}
xxx == &xxx ?
-
Simon2 schrieb:
...
Also letztlich(void*) &a == (void*) &a[0]
eher
a == &a == &a[0]
-
sollte doch eigentlich
6.5.3.2 Address and indirection operators schrieb:
Semantics
3 The unary & operator yields the address of its operand. If the operand has type ‘‘type’’,
the result has type ‘‘pointer to type’’. If the operand is the result of a unary * operator,
neither that operator nor the & operator is evaluated and the result is as if both were
omitted, except that the constraints on the operators still apply and the result is not an
lvalue. Similarly, if the operand is the result of a [] operator, neither the & operator nordabei stehen?
-
Ich habe mich durch aus nicht geirrt. Ich wollte damit nur zeigen das man durchaus auf alle member mit zeigern zugreifen kann und nicht nur auf das erste.
@SeppJ
hast mal versucht auf den zeiten member von A zuzugreifen mit der Methode wie ichs beim Array machte?
Vllt geht das ja schon?
Hab ich allerdings keine Ahnung von!
-
Sqwan schrieb:
Ich habe mich durch aus nicht geirrt. Ich wollte damit nur zeigen das man durchaus auf alle member mit zeigern zugreifen kann und nicht nur auf das erste.
Das hat aber nichts mit dem Thema zu tun.
-
rage_quit schrieb:
...a == &a == &a[0]...
Damit ignorierst du aber die Unterschiedlichkeit der Typen (Array, Zeiger auf Array, Zeiger auf Arrayelelement) - und der Compiler moniert diese Unterschiedlichkeit!
Erst mit der void*-Cast-Brechstange entsteht die "Gleichheit".SeppJ schrieb:
...Klar kann man das machen und es ist auch definiert, dass dies funktioniert. ...
Gut zu wissen! ... allerdings vermisse ich im Standard einen entsprechenden Absatz zu Arrays.
Gruß,
Simon2.
-
Simon2 schrieb:
SeppJ schrieb:
...Klar kann man das machen und es ist auch definiert, dass dies funktioniert. ...
Gut zu wissen! ... allerdings vermisse ich im Standard einen entsprechenden Absatz zu Arrays.
Gibt es natürlich auch. Das ist der berühmte array to pointer decay:
C Standard 6.2.2.1 schrieb:
[#3] Except when it is the operand of the sizeof operator or the unary & operator, or is a character string literal used to initialize an array of character type, or is a wide string literal used to initialize an array with element type compatible with wchar_t, an lvalue that has type ``array of type'' is converted to an expression that has type ``pointer to type'' that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.
-
SeppJ, da hast du den falschen Absatz. Das was da steht ist kurz gesagt nur
a == &a[0]
. Wir interessieren uns ja für&a
. Dass das (modulo Typ) gleich&a[0]
ist, steht in der Tat nicht explizit im C-Standard. Es folgt aber meiner Meinung nach daraus, dass ein Array aus seinen Elementen besteht.
-
Stimmt, mein Zitat passt nicht. Und ich kann ebenfalls keinen genau passenden Absatz finden. Ich bin mir aber ziemlich sicher, dass man die gesuchte Aussage irgendwie aus den ganzen anderen Aussagen des Standards über Arrays und Adressoperatoren herleiten kann. Ich kann mir nämlich nicht vorstellen, dass dies vergessen wurde und noch niemandem aufgefallen ist. Leider wäre die Suche nach allen passenden Zitaten sehr mühselig, da der &-Operator im Standard unter mindestens 2 verschiedenen Namen ("unary &" und "address-of") benutzt wird und Arrays geschätzte 5 verschiedene Bezeichnungen haben, da es zahlreiche Sammelbezeichnungen gibt, in denen Arrays enthalten sind. Ich werde daher nicht versuchen, alle relevanten Textstellen im Standard zu suchen, auch wenn es mich stört, eine solche Frage unbeantwortet zu lassen.
-
Danke schonmal.
Dann bin ich also nicht der Einzige, der das so nicht findet.
Ein wenig ärgerlich ... hätte man doch einfach so reinschreiben können wie für structs ...Wenn jemand noch etwas finden sollte, würde mich das aber freuen.
Gruß,
Simon2.
-
Im C++-Standard gibt es einen Satz:
5.3.3§2 Sizeof schrieb:
When applied to an array, the result is the total number of bytes in the array. This implies that the size of an array of n elements is n times the size of an element.
Aus diesem Satz folgt, dass ein Array exakt aus seinen Elementen besteht, und da diese im Speicher an aufsteigenden Adressen angeordnet sind, muss das erste Byte des Arrays mit dem ersten Byte des ersten Elements übereinstimmen, d.h. die Adressen müssen gleich sein.
Der erste, nicht von mir hervorgehobene, Satz steht so auch im C-Standard. Der zweite ist als logische Folgerung formuliert, müsste also auch im Falle von C gelten. IMHO ist die Formulierung "the result is the total number of bytes in the array" einfach unglücklich. Es ist klar, dass damit die Summe der Bytes der Elemente gemeint sein muss, sonst wäre der Satz ja sinnlos, denn sizeof liefert ja grundsätzlich immer die Gesamtanzahl der Bytes in einem Objekt. Hätte man aber auch eindeutiger formulieren können.
-
Ja - das geht schonmal in diese Richtung.
Wäre aber damit aber nicht noch eine Compilerimplementierung erlaubt, die Arrayvariablen "wie C++-Referenzen" handhabt?
Damit meine ich, dass die Arrayvariable selbst eine andere Adresse hat als das Array und der Compiler stets eine implizite Indirektion durchführt....
(wäre zwar quatschig, aber wir reden hier ja sowieso nur von den theoretischen Möglichkeiten des Standards).Gruß,
Simon2.