C 如何用0xAA填充堆栈?

C 如何用0xAA填充堆栈?,c,stack,C,Stack,我试图用值0xAA或0b10101010填充堆栈(由malloc保留)。我想我设法填满了堆栈,但打印它时,我会根据堆栈大小得到不同的输出(例如e83e83e83…或41f41f41f…)。 有人知道如何解决这个问题吗 int main(void) { int status; int stacksize = 1000; void* stack=malloc(stacksize); void* stackTop = stack + stacksize; for

我试图用值0xAA或0b10101010填充堆栈(由malloc保留)。我想我设法填满了堆栈,但打印它时,我会根据堆栈大小得到不同的输出(例如e83e83e83…或41f41f41f…)。 有人知道如何解决这个问题吗

int main(void) {
    int status;
    int stacksize = 1000;
    void* stack=malloc(stacksize);
    void* stackTop = stack + stacksize;
    for(int i =0; i<stacksize;i++){
        stackTop = "10101010";
        stackTop --;
    }
    stackTop =stack + stacksize;
    for(int i =0; i<stacksize;i++){
            printf("%x", stacksize);
    }
return 0;
}
int main(无效){
智力状态;
int stacksize=1000;
void*stack=malloc(stacksize);
void*stackTop=堆栈+堆栈大小;

对于(inti=0;i您正在用字符串填充堆栈并读取指向它们的指针

Paul Hankin在评论中给出的答案说明了正在使用的正确解决方案之一

memset(stack, 0xAA, stacksize);
填满你的书堆

从而产生以下代码

int main()
{
    int status;
    int stacksize = 1000;
    void* stack = malloc(stacksize);
    void* stackTop = stack + stacksize;
    memset(stack, 0xAA, stacksize); 
    for(int i =0; i < stacksize;i++){
        printf("%x\n", ((unsigned char*)stack)[i]);
    }
    return 0;
}
intmain()
{
智力状态;
int stacksize=1000;
void*stack=malloc(stacksize);
void*stackTop=堆栈+堆栈大小;
memset(stack,0xAA,stacksize);
对于(int i=0;i
从您的代码和注释中很难理解您实际上在做什么。但如果我在此进行推断,您正在尝试创建一个元素大小为一个字节的“堆栈”。下面是这种堆栈的一个快速而肮脏的实现,带有边界检查:

#include <stdio.h>
#include <string.h>

#define STACK_SIZE 1000

struct stack {
    int top;
    unsigned char elts[STACK_SIZE];
};

static void stack_push(struct stack *s, unsigned char elt) {
    if (s->top < STACK_SIZE-1) {
        s->elts[s->top++] = elt;
    } else {
        // No space left in the stack.
    }
}

static void stack_pop(struct stack *s) {
    if (s->top) {
        s->top--;
    } else {
        // Stack is empty
    }
}

static void stack_fill(struct stack *s, unsigned char v) {
    memset(s->elts, v, STACK_SIZE);
    s->top = STACK_SIZE-1;
}

int main(void) {
    // Example driver
    struct stack s;
    stack_fill(&s, 0xAA);

    for (int i = 0; i < STACK_SIZE; i++) {
        printf("%d: %02x\n", s.elts[s.top]);
        stack_pop(&s);
    }
    return 0;
}
#包括
#包括
#定义堆栈大小1000
结构堆栈{
int top;
无符号字符elts[堆栈大小];
};
静态void stack_push(结构堆栈*s,无符号字符){
如果(s->顶部<堆栈大小-1){
s->elts[s->top++]=elt;
}否则{
//堆栈中没有剩余空间。
}
}
静态无效堆栈(结构堆栈*s){
如果(s->top){
s->顶部--;
}否则{
//堆栈是空的
}
}
静态空堆栈填充(结构堆栈*s,无符号字符v){
memset(s->elts,v,堆栈大小);
s->top=堆栈大小-1;
}
内部主(空){
//示例驱动程序
结构栈;
堆栈填充(&s,0xAA);
对于(int i=0;i

作为一种改进,您可以考虑,例如,STACKYPOP返回弹出的元素,或者如果栈为空,返回某种错误,或者返回顶部的PEEK函数,或者类似于前面描述的错误。但是,为了简洁,我省略了它们。


编辑:要初始化堆栈,只需将顶层成员设置为0。初始化函数(如果需要)因此,编写起来很简单。

最后,你打印了很多次
stacksize
而不是堆栈的内容。不幸的是,你的代码几乎每一行都有问题。你的编译在编译时不会产生警告吗?
memset(stack,0xAA,stacksize)
用给定的字节值填充内存。
stackTop="10101010";
是完全错误的。您正在设置一个指向字符串地址的空指针,然后除了内存泄漏之外,实际上没有做任何有意义的事情。了解
*
&
运算符,然后使用一个表示要写入堆栈的数据的指针。您的代码非常糟糕。stackTop用一个点初始化堆栈后面的堆栈。然后将静态字符串的地址分配给它。然后减少此地址。几乎每一行都是错误的。代码仍然中断,您复制了错误。例如:
stack+stacksize
超出堆栈。
((int*)stack)[i]
读取超出分配内存的范围(假设sizeof(int)>1).@reichhart我刚刚决定将stackTop值保留在中,因为它没有在任何地方使用,实际上什么都不做,并且在编译过程中被删除'_(ツ)_/¯