5つのアイテムについてmallocされている間に7つのアイテムをプッシュしていますが、セグメンテーションは起こっていません。私は何が欠けていますか?私は、これは、ポインタが配列の境界を越えて移動させるだろうと思ったとCがハンドリングされたキューにアイテムをあまりにも多く押し込んでいる - なぜこれはセグメンテーションではありませんか?
#include "stdlib.h"
#include "stdio.h"
#include "assert.h"
typedef struct {
int *space;
int size;
int *start;
int *end;
} queue_t;
typedef char BOOL;
#define TRUE 1
#define FALSE 0
void queue_print(queue_t *queue) {
for (int *cur = queue->start; cur < queue->end; cur++) {
printf("%i,", *cur);
}
printf("\n");
}
void queue_init(queue_t **queue, int size) {
(*queue) = (queue_t*) malloc(sizeof(queue_t));
(*queue)->space = (int*) malloc(sizeof(int) * size);
(*queue)->size = size;
(*queue)->start = (*queue)->space;
(*queue)->end = (*queue)->space;
}
void queue_push(queue_t *queue, int elem) {
*(queue->end) = elem;
queue->end++;
}
int queue_pop(queue_t *queue) {
int ret = *(queue->start);
queue->start++;
return ret;
}
int main(int argc, char const *argv[])
{
queue_t *queue;
queue_init(&queue, 5);
queue_print(queue);
queue_push(queue, 1);
queue_print(queue);
queue_push(queue, 2);
queue_print(queue);
queue_push(queue, 3);
queue_print(queue);
queue_push(queue, 4);
queue_print(queue);
queue_push(queue, 5);
queue_print(queue);
queue_push(queue, 6);
queue_print(queue);
queue_push(queue, 7);
queue_print(queue);
printf("%i\n", queue->size);
queue->space[123] = 4;
return 0;
}
出力は次のようになります。
1,
1,2,
1,2,3,
1,2,3,4,
1,2,3,4,5,
1,2,3,4,5,6,
1,2,3,4,5,6,7,
よく、次のmallocにはおそらく問題があります。 :-)メインでコードを複製し、別のキューを作成しようとします。 – Arash
興味深い。 clangスタティックアナライザは、2番目のキューのメモリリークを警告します。 –