char数组崩溃我的堆栈结构。我说错了吗?

时间:2012-10-25 04:31:09

标签: c crash stack arrays

我试图获得关于堆栈结构如何工作的直觉,但出于某种原因,我尝试从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;
}

2 个答案:

答案 0 :(得分: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中的一个字符,因为它会将其视为char解除引用。如果您想复制字符串,请改用strcpy(但请确保您有足够的空间!!)

答案 1 :(得分:0)

问题在于本声明

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

将此更改为

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

你的程序不会崩溃。

带有%s的printf需要以空字符结尾的字符串。您没有带有S-&gt; charElements [3]的空终止字符串。它只是一个字符。