我试图获得关于堆栈结构如何工作的直觉,但出于某种原因,我尝试从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;
}
答案 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]的空终止字符串。它只是一个字符。