【发布时间】:2011-08-01 04:13:56
【问题描述】:
我有一些 C 代码,但我不太确定发生了什么。
#include <stdio.h>
#include <stdlib.h>
#define DIM1 7
#define DIM2 5
#define RES_SIZE 1000
typedef double stackElementT;
typedef struct {
stackElementT *contents;
int maxSize;
int top;
int min2;
} stackT;
void StackInit(stackT *stackP, int maxSize) {
stackElementT *newContents;
newContents = (stackElementT *)malloc(sizeof(stackElementT)*maxSize);
if (newContents == NULL) {
fprintf(stderr, "Not enough memory.\n");
exit(1);
}
stackP->contents = newContents;
stackP->maxSize = maxSize;
stackP->top = -1;
}
void StackDestroy(stackT *stackP) {
free(stackP->contents);
stackP->contents = NULL;
stackP->maxSize = 0;
stackP->top = -1;
}
int StackIsEmpty(stackT *stackP) { return stackP->top < 0; }
int StackIsFull(stackT *stackP) { return stackP->top >= stackP->maxSize-1; }
void StackPush(stackT *stackP, stackElementT element) {
if(StackIsFull(stackP)) {
fprintf(stderr, "Can't push element: stack is full.\n");
exit(1);
}
stackP->contents[++stackP->top] = element;
}
stackElementT StackPop(stackT *stackP) {
if(StackIsEmpty(stackP)) {
fprintf(stderr, "Can't pop element: stack is empty.\n");
exit(1);
}
return stackP->contents[stackP->top--];
}
int shell(char* s1, int arg) {
printf("> ");
scanf("%s %d%*c", &s1, &arg);
return arg;
}
int main() {
char cmds[DIM1][DIM2] = {{"push"}, {"pop"}, {"add"}, {"ifeq"}, {"jump"}, {"print"}, {"dup"}};
char* s1; int arg;
arg = shell(s1, arg);
printf("%s\n", &s1);
}
输入:push 4。它打印 J+ 而不是“推送”,但正常打印 4。
它还在编译时给出这些警告:
stack.c: In function ‘shell’:
stack.c:60: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
stack.c: In function ‘main’:
stack.c:71: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **’
stack.c:65: warning: unused variable ‘cmds’
stack.c:69: warning: ‘arg’ is used uninitialized in this function
谁能解释一下?
【问题讨论】:
-
没有。它上面有一个小的堆栈实现,但我想没有人想看它。
-
谢谢,正在努力……
-
这段代码是否有意图,或者您只是在问执行时的逻辑流程是什么?因为我没有看到 main() 中调用的堆栈代码中的任何内容,只是扫描和打印...
-
没错。只是@jcomeau_ictx 似乎想要那里的所有代码。堆栈实现无关紧要。
-
@tekknolagi:我只想说,很高兴您尝试按照要求进行操作。下次尽量记住,最好让你的编译器错误和警告与代码示例相匹配,以便整个问题统一。在旁注中,我个人喜欢这个问题如何跟进你的最后一个问题。希望其余的实施顺利!
标签: c error-handling compiler-errors warnings