私は次のコードとその小さな部分が意味をなさなかったので、それは私が現在持っている知識を超えていたので、誰かが私のためにこの小さな問題を解決できるかどうか疑問に思っていました.
stack.h
#ifndef _STACK_H
#define _STACK_H
#include "lis1.h"
typedef List Stack ;
#define stack_init list_init
#define stack_destroy list_destroy
#define stack_size(stack) (stack)->size
#define stack_is_empty(stack) ((stack)->size==0)?1:0
int stack_push(Stack*stack,void*data);
int stack_pop(Stack*stack,void**data);
#endif
#define stack_is_empty(stack) ((stack)->size==0)?1:0
以下のプログラムをコンパイルする際は注意してください。
#include<stdio.h>
#include"stack.h"
static char ams[5] = { 'h', 'e', 'l', 'l', 'o' };
void* data;
Stack stack;
char*ss;
void debug(int a)
{
printf(" debug %d \n", a);
}
int main()
{
stack_init(&stack, NULL);
debug(1);
int i;
for (i = 0; i < 5; i++)
{
stack_push(&stack, (void*) (&ams[i]));
};
debug(2);
while (printf("checker\n") && stack_is_empty(&stack) != 1)
{
printf("->");
printf("[%d ", stack_size(&stack));
stack_pop(&stack, &data);
printf("%c]", *((char*) data));
printf("--\n");
};
return 0;
}
私はこれを得る
debug 1 debug 2 checker
->[5 o]-- checker
->[4 l]-- checker
->[3 l]-- checker
->[2 e]-- checker
->[1 h]-- checker
segmentation fault
しかし、に変更#define stack_is_empty(stack) ((stack)->size==0)?1:0
すると#define stack_is_empty(stack) (((stack)->size==0)?1:0)
、セグフォルトはありません
マイクエリ
条件が「1」を吐き出すまで、前者のケースでプログラムが完全に正常に機能したのはなぜですか..後者が機能する理由を理解しているようです。