c - 这是缓冲区溢出的示例吗?

标签 c memory-management buffer buffer-overflow

以下代码在我的计算机(Mac OS X Yosemite 64 位架构)上生成了此输出:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
    int *p = malloc(sizeof(int));
    *p = 5;
    int *q = p;
    q = *(p + 1);
    printf("p is %p\n", p);
    printf("q is %p\n", q);
    return 0;
}

输出:

p is 0x7f8f49404c90

q is 0xffffffffb0000000

第二个指针是一个相当大的数字,所以我想知道这是缓冲区溢出是否正确。

最佳答案

int *p = malloc(sizeof(int));

分配的内存只能容纳一个整数。

您已经在这样做

*p = 5;

现在您正在增加指针

(p+1)

这是您尚未分配的内存位置。现在您正尝试读取存储在 (p+1) 中的数据,这将导致您提到的未定义行为,这是缓冲区溢出。

*q = *(p+1) 

然后尝试将此值分配给 *q 这可能会导致崩溃。

关于c - 这是缓冲区溢出的示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27119982/

相关文章:

c - 指针 C 的值

C : memcpy to the "end" of a buffer

linux - 生成无限流

unix - dlmalloc 如何合并 block ?

memory-management - Rust-如何在结构中使用大小不一的特征对象

c++ - 如何读取包含 '\0' 个字符的文件?

c - 我如何为 MIPS 架构编译 nfsutils?

c - 如何正确定义全局结构变量?

c - 如何像基于 Unix 的 man 手册一样记录源代码功能?

c++ - 如何在 C++ 中为缓冲区分配更多内存?