在C中为指针指定特定的内存位置

时间:2017-03-02 02:26:33

标签: c

所以我正在尝试,并且我试图更好地理解如何在C中手动将指针放在内存中。

到目前为止,我所做的是创建了一个结构并指定了一个指针,现在我正在尝试创建另一个结构,而不是#x;' x'远离第一个结构的内存空间量。例如,如果' x'是50个字节,我希望两个指针彼此相距50个字节。

任何帮助将不胜感激!

编辑*** 我想我在这里省略了一个关键点,我使用malloc()来留出一些内存来处理。而且我试图保持在我已经放弃的那段记忆的界限之内。但是我试图在相对于起始位置的那个预留内存中提供精确的内存位置。

3 个答案:

答案 0 :(得分:2)

  

如果' x'是50个字节,我希望两个指针彼此相距50个字节。

你很幸运,因为C有一个完美的机制,可以将指针精确地放在struct的大小上。好的,不是完全正好 * ,但足够接近大多数实际用途。

通过声明两个项目的数组来获得此行为。根据{{​​1}}及其实际大小的对齐方式,它们至少会被放置在内存中sizeof(struct mystruct)

struct

现在指针struct mystruct { ... }; // This is your struct definition ... struct mystruct array[2]; struct mystruct *a = &array[0]; struct mystruct *b = &array[1]; a相隔b

* Alignment变得非常重要,因为精确地指定结构大小的指针会产生性能问题,甚至无法让程序在给定平台上运行。例如,某些平台只需要在偶数地址放置指针;如果sizeof(struct mystruct)的第一个元素是指针,并且struct具有奇数大小,则需要在末尾添加一个额外的字节,以使程序能够运行。

答案 1 :(得分:1)

指针只是与内存位置对应的数字。你可以对它们进行数学运算,但它的工作方式与正常情况有所不同。它被称为pointer arithmetic

向指针添加1会使其在内存中向前移动而不是1个字节,而是指向它所指向的大小。如果它是char *,它将移动1个字节。如果它是int *,它将移动4或8个字节,具体取决于整数的大小。如果它是一个50字节的结构,它将向前移动50个字节。

所以你需要做的就是在指针上添加1。

#include <stdio.h>

struct example {
    char string[50];
};

int main() {
    struct example foo; 
    struct example *bar = &foo + 1;

    printf("%p %p\n", &foo, bar);
}

$ ./test
0x7fff5897b4a0 0x7fff5897b4d2

...除了现在bar指向未分配的内存。如果您尝试使用它,它将是undefined behavior

如果你想在你可以实际使用的内存中创建彼此相邻的两个结构,请创建一个数组。

#include <stdio.h>

struct example {
    char string[50];
};

int main() {
    struct example list[2];

    printf("%p %p\n", &list[0], &list[1]);
}

$ ./test
0x7fff5ba21470 0x7fff5ba214a2

或者如果您正在使用堆内存......

#include <stdio.h>
#include <stdlib.h>

struct example {
    char string[50];
};

int main() {
    struct example *list = malloc( 2 * sizeof(struct example) );

    printf("%p %p\n", &list[0], &list[1]);
}

答案 2 :(得分:1)

我不确定如何将指针放在某个地址上,但我认为有一些方法可以确保两个事物对齐,或者相隔一定数量的字节。

在K&amp; R 2e中,在第186页的顶部:

screenshot

所以我猜你可以把你的结构包装在一个 union 中,而 typedef 对齐一些大小为 n 的类型,其中 n 是您希望它们彼此分开的字节数。