2016-04-10 3 views
1

Ich möchte sicherstellen, dass ein gegebenes Zeichenfolgenliteral an einer Adresse endet, die ein Vielfaches von 2 oder besser 4 ist.Wie kann ich ein String-Literal an eine Adresse ausrichten, die ein Vielfaches von 4 ist?

Gibt es eine Möglichkeit, dies zu erreichen, vorzugsweise ohne Verwendung von Compiler-spezifischen Erweiterungen? Oder ist es unmöglich?

Ich möchte dies so tun, dass die untersten Bits der String-Adresse 0 sind und (ab) als Tag-Bits verwendet werden können.

+0

was können wir verstehen für *** Ausrichtung einer Zeichenfolge an eine Adresse *** ... können Sie uns erklären, was das bedeutet ??? –

+0

@Xoce: Zeichenfolgen in c sind einfache Zeiger auf char. Und jeder Zeiger hat eine Adresse. Ich möchte in gewisser Weise sicherstellen, dass diese Adresse ein Vielfaches von vier ist. – Askaga

Antwort

3

Sie können dies mit C11 (aber nicht C99) tun. Für statisch zugewiesenen Puffer können Sie alignas, dies zu tun:

#include <stdio.h> 
#include <stdalign.h> 

alignas(4) char str[] = "this is aligned to at least 4 bytes"; 

int main() { 
    char a; 
    alignas(4) char str2[] = "and again"; 
    printf("%p\n", &a); 
    printf("%p\n", str); 
    printf("%p\n", str2); 
} 

Der Trick oben ist, dass der Stringliteral ist eigentlich sein Einsatz einen char-Array der gleichen Größe zu initialisieren, die Sie verwenden alignas in der Art ermöglicht.

Für dynamisch zugewiesene verwenden Sie aligned_alloc(size_t alignment, size_t size) anstelle von malloc.

(Es gibt auch andere ältere Nicht-Standard-Möglichkeiten dies zu tun, die Compiler zurück ganz irgendwie auch mit GCC/Clang/Intel arbeiten)

0

In C99 Sie dies mit einer Gewerkschaft tun, zum Beispiel

#define ALIGNED_STR_UNION(N, S) const union { char s[sizeof S]; int align; } N = { S } 
ALIGNED_STR_UNION(sssu, "XYZABC"); 

Stellen Sie bei Bedarf den Typ int ein.

Damit bezieht sich sssu.s auf die Zeichen.

Die .s kann wie

#define ALIGNED_STR(S) ((const union { char s[sizeof S]; int align; }){ S }.s) 
const char *sss = ALIGNED_STR("XYZABC"); 

jedoch diese Version Abfälle Platz auf dem Zeiger (einschließlich einer relativen Verlagerung für die Position unabhängigen Code) vermieden werden und keine statischen Literale in Funktionen zu deklarieren.

Es ist wahrscheinlich besser, stattdessen die nicht standardmäßigen Ausrichtungsattribute zu verwenden.

Verwandte Themen