如何将字符串文字对齐到4的倍数的地址?

时间:2016-04-10 12:06:45

标签: c string c99 string-literals

我想确保给定的字符串文字最终为地址的2倍,甚至更好,4。

有没有办法实现这一点,最好不使用任何特定于编译器的扩展?或者这是不可能的?

我想这样做,所以字符串地址的最低位是0,可以(ab)用作标记位。

2 个答案:

答案 0 :(得分:3)

您可以使用C11(但不是C99)执行此操作。对于静态分配的缓冲区,您可以使用alignas执行此操作:

#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);
}

上面的技巧是字符串文字实际上用于初始化相同大小的char数组,这允许你在类型中使用alignas

对于动态分配的,您使用aligned_alloc(size_t alignment, size_t size)代替malloc

(还有其他一些较旧的非标准方法可以与GCC / Clang /英特尔编译器一起使用,也可以在某种程度上回归)

答案 1 :(得分:0)

在C99中,您可以使用联合执行此操作,例如

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

根据需要调整类型int

有了这个,sssu.s指的是人物。

可以像

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

但是,这个版本浪费了指针上的空间(包括位置无关代码的相对重定位),并且不允许在函数中声明静态文字。

最好使用非标准对齐属性而不是此。