我正在推送7个项目,而我只锁定了5个项目,但我没有看到任何段错误发生。我遗漏了什么?我认为这会导致指针移过数组边界,并且
#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,发布于 2017-03-08 09:50:01
C不会检查出界访问,但是您的程序会损坏堆,并且当您将来再次调用malloc()时,可能会出现段错误。
发布于 2017-03-08 10:08:38
在调用queue_init时,您可以分配空间来容纳5个int。如果您在gdb中运行您的代码,并检查queue->start位置的内存,您将看到如下所示:
(gdb) p *queue您将看到起始成员的内存地址。在检查内存命令中使用该地址,如下所示:
(gdb) x/8 0x602450gdb将打印如下内容:
0x602450: 0 0 0 0
0x602460: 0 0 134049 0第5个字节之后的所有内容都属于未分配或以前分配的内容。在第七次调用queue_push之后,您再次检查内存,您将看到如下所示:
(gdb) x/8 0x602450
0x602450: 1 2 3 4
0x602460: 5 6 7 0因此,运行库不会阻止您覆盖未分配的或以前分配的内存。但是,您可能已经重写了一些重要的内容,这可能会给运行时或进程中的其他线程带来问题。
https://stackoverflow.com/questions/42661522
复制相似问题