我知道这是一个非常基本的问题,可能会有重复,但我找不到一个严格的答案这个具体的问题,指的标准。(我看到有人说是UB,另一些人说不是)
如果我分配一个内存块而不填充数据,
int* ptr = malloc(10 * sizeof(int));然后试着读取它,那里的值将是垃圾。
但这是一种未定义的行为吗?或者只是糟糕,但至少不是一个UB?
发布于 2021-03-28 09:08:52
是的,你可以读。
内存管理器通过调用malloc将内存分配给您,所以现在它是您的了,您可以使用它做任何事。这包括读取它,例如打印它为一个ints数组。
Eric讨论了编译器可以优化指令,但是,他的讨论是基于这样一个事实,即编译器知道malloc,并且返回“未初始化”内存,即用户程序没有为其分配值的内存。
但本质上,malloc只是一个返回对象的函数,编译器必须假设返回的对象具有有意义的值,就像用户函数返回对象时一样。也不能存在“带内”陷阱值,因为内存所具有的任何值都可以是合法值( 32位int的所有32位都被使用)。只能有带外的陷阱值,也就是说,额外的硬件就像额外的硬件位.但是,陷阱值已成为运行时。
如果用户使用了扩展现有内存块(甚至是“无内存块”)的realloc,那么编译器,即使了解realloc,也不能假设返回对象的任何内容,也不能优化指令。没有什么是编译器可以假设的。
请注意,作为安全措施,内存管理器可能已经将内存设置为一些未指定的值,以防止程序从其他用途留下的内存中读取数据。
发布于 2021-03-31 23:06:57
由于在某些情况下,实现可以保证对malloc()存储的重复读取将产生一致的值,除非或直到它被写入,而且在某些情况下,不受这种保证约束的实现可能是有用的,因此,是否有任何特定的实现应该提供这种保证的问题是标准管辖范围之外的实现质量问题。
至于读一读这样的存储是否会产生无意义的值之外的副作用,这还不是很清楚。当然,对于诊断实现来说,捕捉这样的读取可能是有用的,但是标准并没有明确地提供这样的内容。另一方面,我不认为标准明确规定从malloc返回的存储不会表现为任意对象被写入它,从而导致这种存储与任意有效类型相关联。这些问题再一次归结为标准管辖范围以外的执行质量问题。
https://stackoverflow.com/questions/66839765
复制相似问题