存储值是否超过多个字节未定义?

时间:2016-11-19 17:10:09

标签: c memory memory-management

好的,所以我写了一个像堆栈一样工作的内存分配器。它由一个字符数组组成,这是我的记忆。当我分配内存时,我基本上将一个指针(强制转换为void *)返回到一些空闲内存,然后我递增一个指针,该指针跟踪我要求的字节数下一个可用内存的下一位。

Freeing就是这么简单,我只是制作指针,它在我分配一些内存之前跟踪下一位空闲内存点到它所指向的位置。它基本上是一个堆栈。

当我将(void *)转换为(int *)时,它会占用该内存,然后将该整数扩展到我的字符数组中的元素。现在,我想知道这是否会导致未定义的行为?我认为这与big-endian和little-endian有关。这是一些代码:

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

#define BUFSIZE 1024

unsigned char buffer[BUFSIZE];
unsigned char *next = buffer;

void *alloc(int n){
    if(next + n <= buffer + BUFSIZE){
        next += n;
        return (void *)(next - n);
    }else{
        return NULL;
    }
}

void afree(void *c){
    next = (char *)c;
}

int main(){
    int *num = (int *)alloc(sizeof(int));
    *num = 346455;
    printf("%d: %d\n", *num, sizeof(int));
    printf("%d, %d, %d, %d", *(next - 4), *(next - 3), *(next - 2), *(next - 1));
    afree(num);
}

主要做的就是它要求一些内存,然后将该内存的值设置为整数。我的第一个printf语句也可以正常工作!它正确打印整数,并打印出整数占用的字节数。

我的第二个printf语句虽然有点有趣;它打印出整数构成的所有四个字节:87,73,5,0。如果我那么,用这些数字(按相反顺序),取其二进制值并将它们粘在一起并转换为大二进制数字到十进制,我得到我的原始int。所以,正如我之前所说:这是否会导致未定义的行为,或者它是否始终按预期工作

0 个答案:

没有答案