2011-08-01 47 views
0

我有一些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 

可有人請解釋一下嗎?

+0

不是。上面有一個小堆棧實現,但我想沒有人想要通過它。 – tekknolagi

+1

謝謝,正在工作...... –

+0

有沒有這個代碼的意圖,或者你只是問在執行時什麼是邏輯流程?因爲我沒有看到main()中調用的堆棧代碼的任何內容,只是進行掃描和打印...... – donnyton

回答

3

當您使用%s格式說明符時,它會指望一個指向字符串開頭的指針。在C中,這種類型是char *

main函數爲例,變量s1的類型爲char *。因此,s1printf一個有效的參數,所以這條線是有效的:

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

注意的&缺席s1前面。在你的代碼中,你使用了&,它的地址爲s1,其結果將是char **。這是錯誤的類型,所以不要使用&

事情是,printf實際上不能告訴它的參數是什麼類型,因爲它是一個可變參數函數。它根據格式字符串中指定的類型簡單地使用任何參數。

scanf也是一樣,但是有一個缺陷:您必須確保分配了足夠的內存來解釋用戶輸入,否則您將遇到緩衝區溢出併產生不可預知的結果。除此之外,printfscanf是完全互補的。

Anyhoo,除了未使用的cmds變量(這在提供的代碼中是不必要的),這會處理編譯器警告。此外,還有args的一部分 - 它確實應該是一個在shell內部聲明的變量,並且不會作爲參數傳遞,因爲它的值甚至不在shell內部使用。

不知道剩下的代碼是怎麼回事。考慮到您的main功能只能撥打shell,這是多餘的。

+0

謝謝你的提示。但是,當我刪除和號('&')時,運行時會得到一個段錯誤,輸入相同。 – tekknolagi

+2

就像我剛纔提到的那樣,你必須自己分配一個'char *'緩衝區*,即聲明's1'類似'char * s1 =(char *)malloc(50);'。這給你50個字符的輸入空間。或者,只需使用一個數組:'char s1 [50];'。無論哪種方式,只要記住,無論何時您需要輸入,您都必須*確保有足夠的緩衝區來存儲輸入。 –

+1

這是因爲您尚未初始化指向指向保留內存的指針以存儲文本事實上你甚至沒有保留這樣的記憶。 –