не уверен, что происходит в этом коде - PullRequest
0 голосов
/ 01 августа 2011

У меня есть код на 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+ вместо «push», но печатает 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

Может кто-нибудь объяснить, пожалуйста?

1 Ответ

3 голосов
/ 01 августа 2011

Когда вы используете спецификатор формата %s, он ожидает значение, которое является указателем на начало строки. В Си этот тип char *.

Используя вашу main функцию, ваша переменная s1 имеет тип char *. Следовательно, s1 является допустимым параметром для printf, поэтому эта строка действительна:

printf("%s\n", s1);

Обратите внимание на отсутствие & перед s1. В вашем коде вы использовали &, который принимает адрес s1, результат которого будет иметь тип char **. Это неправильный тип, поэтому не используйте &.

Дело в том, что printf на самом деле не может сказать, к какому типу относятся его аргументы, поскольку это функция с переменным числом. Он просто использует все имеющиеся аргументы в соответствии с типами, указанными в строке формата.

То же самое относится и к scanf, но есть подводный камень: вы должны убедиться, что выделено достаточно памяти для учета ввода пользователя, иначе вы столкнетесь с переполнением буфера с непредсказуемыми результатами. Помимо этого, printf и scanf идеально дополняют друг друга.

В любом случае, это заботится о предупреждениях компилятора, кроме неиспользуемой переменной cmds (в предоставленном коде это не нужно). Также есть часть args - это действительно должна быть переменная, объявленная внутри shell, и не передаваемая как параметр, поскольку ее значение даже не используется внутри shell.

Не знаю, что случилось с остальным кодом. Это излишне, учитывая, что ваша main функция вызывает только на shell.

...