0

スタック構造がどのように機能するかについて直感を得ようとしていますが、何らかの理由で から印刷しようとするとcharElements、プログラムがクラッシュし、その理由がわかりません。これは私が取得し続けるエラーです: (ブレークポイントにあります) while (i-- && *p). しかし、私がすべてを宣言した方法に何が問題なのかわかりません。何かご意見は?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct Stack
{
    int capacity;       // max # of elements the stack can hold
    int size;           // current size of the stack
    int *elements;      // the array of elements
    char *charElements; // the array of chars
}Stack;

Stack * createStack(int maxElements)
{        
    // Create a Stack         
    Stack *S;        
    S = (Stack *)malloc(sizeof(Stack));        
    // Initialise its properties         
    S->charElements = (char *)malloc(sizeof(int)*maxElements);
    S->elements = (int *)malloc(sizeof(int)*maxElements);   
    S->size = 0;        
    S->capacity = maxElements;        
    /* Return the pointer */        
    return S;
}




int main()
{

    Stack *S = createStack(60);     

    char registerNames[63] = {"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};

    // if the user input a a string



    S->elements[S->size++] = 1;
    S->elements[S->size++] = 2;
    S->elements[S->size++] = 3;

    S->charElements[S->size++] = *registerNames;

    printf("%d \n", S->elements[0]); 
    printf("%d \n", S->elements[1]); 
    printf("%d \n", S->elements[2]);  
    printf("%d \n", S->size); 
    printf("%s \n", S->charElements[3]);


    system("pause");

    return 0;
}
4

2 に答える 2

2
printf("%s \n", S->charElements[3]);

S->charElements[3]ではcharなく、char *です。そのため、印刷しようとすると、不正なメモリ アドレスが逆参照されてクラッシュします。

代わりに、その位置にprintf("%c \n",S->charElements[3]);を印刷するために使用します。char

また、

S->charElements[S->size++] = *registerNames;

は逆参照registerNamesとして扱うため、 から1 文字だけをコピーします。char文字列をコピーしたい場合は、strcpy代わりに使用してください (ただし、十分なスペースがあることを確認してください!!)

于 2012-10-25T04:43:13.327 に答える
0

問題はこのステートメントにあります

printf("%s \n", S->charElements[3]);

これをに変更

printf("%c \n", S->charElements[3]);

あなたのプログラムはクラッシュしません。

%s を指定した printf には、ヌルで終了する文字列が必要です。S->charElements[3] でヌル終了文字列がありません。それはただの1文字です。

于 2012-10-25T04:46:25.693 に答える