gpt4 book ai didi

c - 为什么通过访问指针使程序崩溃?在 C 中

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:04 25 4
gpt4 key购买 nike

我试图访问一个指针,但程序崩溃了。内存访问错误。我从堆栈接收指针。 (弹出功能)。作为 void* 指针。为什么我会出现这种行为?

int main()
{
int MAX = 5;
int field[MAX];
int i; /* for the loop */
int *pInt = NULL;

initStack();

for (i = 0; i < MAX; i++)
{
field[i] = i;
push((field + i)); // HERE CRASH
}

for (i = 0; i < MAX; i++)
{
pInt = pop(); /* fetch next integer */

printf("%d\n", *pInt); /* print value */
}



return EXIT_SUCCESS;
}

更新:

我已经测试了我的堆栈。它有效。但是使用 for 循环它会崩溃。

我的堆栈实现。我总是在访问指针时收到错误消息。

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

#include "stack.h"

/*
actual stack data structure
This pointer will pointing at the actual field (of void * pointers)
that represents the stack.
*/
void **array;

/* the current capacity of the stack */
int max = 10;

/* counter variable for counting the elements of the stack. */
int counter = 0;

/*
offset address
points at the top element of the stack.
*/
int offset = -1;

void initStack(void)
{

array = malloc(sizeof(void) * max);
assert(array); /* tests whether pointer is assigned to memory. */
}

/*
grow: increases the stack by 10 elements.
This utility function isn't part of the public interface
*/
void grow(void)
{
max += 10; /* increases the capacity */

int i; // for the loop
void **tmp = malloc(sizeof(void) * max);

/* copies the elements from the origin array in the new one. */
for (i = 0; i < max - 10; i++)
{
*(tmp + i) = *(array + i);
}

array = tmp; /* setups the new one as basis */
}

/* push: pushs the argument onto the stack */
void push(void *object)
{

assert(object); /* tests whether pointer isn't null */

if (offset < max)
{

offset++; /* increases the element-pointer */

/*
moves pointer by the offset address
pushes the object onto stack
*/
*(array + offset) = object;
}
else /* stack is full */
{

/* TODO */
grow();
push(object); /* recursive call */
}
}

/*
pop: pops the top element of the stack from the stack.
*/
void *pop(void)
{
printf("\tBEFORE\n"); //DEBUG
void *top = *(array + offset);
assert(top);
assert(array + offset);
printf("\tAFTER void *top = *(array + offset);\n"); //DEBUG
// int *pInt = top;
// printf("\tpop: value= %d\n", *top); /* DEBUG */

/* decreases the offset address for pointing of
the new top element */
offset--;

return top;
}

最佳答案

您的堆栈实现有一个错误。在 initStackgrow 中,您都这样做:

malloc(sizeof(void) * max);

这是无效的,因为 void 没有大小,尽管有些编译器会将其计算为 1。因此您没有为 void *< 的数组分配足够的空间。结果,您写入了调用 undefined behavior 的已分配内存的末尾。 .

在两个地方将您要获取大小的类型更改为 void *

malloc(sizeof(void *) * max);

关于c - 为什么通过访问指针使程序崩溃?在 C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47717552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com