C 如何用0xAA填充堆栈?
我试图用值0xAA或0b10101010填充堆栈(由malloc保留)。我想我设法填满了堆栈,但打印它时,我会根据堆栈大小得到不同的输出(例如e83e83e83…或41f41f41f…)。 有人知道如何解决这个问题吗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
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值保留在中,因为它没有在任何地方使用,实际上什么都不做,并且在编译过程中被删除'_(ツ)_/¯