C 在 handrolled 队列上推送太多项目——为什么这不是段错误?

标签 c segmentation-fault

<分区>

我正在推送 7 个项目,而我只为 5 个项目分配 malloc,但我没有看到任何段错误发生。我错过了什么?我认为这会导致指针移过数组边界并且

#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,

最佳答案

C 不检查越界访问,但是您的程序破坏了堆,并且当您将来再次调用 malloc() 时,您可能会遇到段错误。

关于C 在 handrolled 队列上推送太多项目——为什么这不是段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42661522/

相关文章:

c - qsort 与 32 位无符号整数比较,失败,我没有看到错误?

通过 ctypes 使用 pcap 的 python 段错误

c - 返回指针的函数中的段错误

c - 为什么以下代码会引发 SegFault。 c(Linux)

c - 这个 C 代码片段有什么作用

c - Pair Sum - 固定总和,多个子数组

c - 错误 : "pointer being freed was not allocated" in c

c - UDP recvfrom查询

c - 将行分割成单词并使用 strtok 将它们放入 char 数组中

c++ - 为什么std::random_device类成员导致段错误?