gpt4 book ai didi

c - Stack 内容中保存的数据不断变化,无法递增

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

所以这是我的问题,过去 5 个小时我一直在努力解决这个问题,我有一个头文件、一个测试程序文件和一个 c 源文件。我真的很想了解正在发生的事情以及原因,这样我以后就可以避免这个问题。头文件声明了结构但没有定义它:

typedef struct Stack *StackP;

在我的源文件 Stack.c 中,我定义了堆栈:

struct Stack
{
int top;
int capacity;
int count;
ItemT items;
};

其中 ItemT 定义为 char *

在测试文件中,调用是这样的:

StackP stackPtr = newStack();

我在 c 源文件中的 newStack 函数是:

StackP newStack(void) {
struct Stack stack1;
StackP stackPtr = &stack1;
(stackPtr->items) = (ItemT)malloc(DEFAULT_CAPACITY*sizeof(ItemT));

(stackPtr->top) = -1;
(stackPtr->capacity) = DEFAULT_CAPACITY;
(stackPtr->count) = 0;
fprintf(stderr, "\nSuccesfully allocated memory to items...\n");

return stackPtr;
}

现在,我的推送功能是:

void pushStack(StackP stackPtr, ItemT item) {           
if ((stackPtr->count) == (stackPtr->capacity)) {
fprintf(stderr, "\nERROR: Full stack.\n");
}
else {
stackPtr->items = item;
fprintf(stderr, "\nSuccessfully pushed %s on to the stack...\n", stackPtr->items);
(stackPtr->items)++;
(stackPtr->top)++;
(stackPtr->count)++;
}
}

我的问题是:这些代码块中的任何一个都没有错吗?

如果我调用一个函数说:

return (stackPtr->count);

它将返回一组随机数而不是 0 或 1。例如,如果我将 2 个字符串压入堆栈,而不是计数为 2,则计数为 479622 或其他一些随机数长号。为什么会这样?

同样,我想知道我做错了什么,而不仅仅是正确的语法,因为我真的必须理解这一点。

最佳答案

程序有未定义的行为,因为它从函数返回局部变量的地址:

StackP newStack(void) {
struct Stack stack1;
StackP stackPtr = &stack1;

return stackPtr;
}
newStack 退出时,

stack1 不再存在。 stackPtr 必须指向动态分配的内存,如果它存在于函数范围之外的话:

StackP newStack(void) {
struct Stack stack1;
StackP stackPtr = malloc(sizeof(*stackPtr));
if (stackPtr)
{
}

return stackPtr;
}

参见 Do I cast the result of malloc?

关于c - Stack 内容中保存的数据不断变化,无法递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098588/

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