首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C在手动队列中推入太多的项目--为什么这不是segfaulting?

C在手动队列中推入太多的项目--为什么这不是segfaulting?
EN

Stack Overflow用户
提问于 2017-03-08 09:45:49
回答 2查看 40关注 0票数 2

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

代码语言:javascript
运行
复制
#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;
}

输出为:

代码语言:javascript
运行
复制
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,
EN

Stack Overflow用户

发布于 2017-03-08 10:08:38

在调用queue_init时,您可以分配空间来容纳5个int。如果您在gdb中运行您的代码,并检查queue->start位置的内存,您将看到如下所示:

代码语言:javascript
运行
复制
(gdb) p *queue

您将看到起始成员的内存地址。在检查内存命令中使用该地址,如下所示:

代码语言:javascript
运行
复制
(gdb) x/8 0x602450

gdb将打印如下内容:

代码语言:javascript
运行
复制
0x602450:   0   0   0   0
0x602460:   0   0   134049  0

第5个字节之后的所有内容都属于未分配或以前分配的内容。在第七次调用queue_push之后,您再次检查内存,您将看到如下所示:

代码语言:javascript
运行
复制
(gdb) x/8 0x602450
0x602450:   1   2   3   4
0x602460:   5   6   7   0

因此,运行库不会阻止您覆盖未分配的或以前分配的内存。但是,您可能已经重写了一些重要的内容,这可能会给运行时或进程中的其他线程带来问题。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42661522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档