所以这是我的问题,我一直试图在过去的5个小时内解决这个问题,我有一个头文件,一个测试文件和一个c源文件。我真的很想了解发生了什么,以及为什么我可以在将来避免这个问题。头文件声明了struct但没有定义它:
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
或其他一些随机长数。为什么会这样?
同样,我想知道我做错了什么,而不仅仅是正确的语法,因为我真的必须理解这一点。
答案 0 :(得分:7)
程序具有未定义的行为,因为它从函数返回局部变量的地址:
StackP newStack(void) {
struct Stack stack1;
StackP stackPtr = &stack1;
return stackPtr;
}
退出stack1
时 newStack
不再存在。 stackPtr
必须指向动态分配的内存,如果它存在于函数范围之外:
StackP newStack(void) {
struct Stack stack1;
StackP stackPtr = malloc(sizeof(*stackPtr));
if (stackPtr)
{
}
return stackPtr;
}