gpt4 book ai didi

c - 释放分配给 char* (由 `malloc` 分配)的 int* 是否会调用未定义的行为?

转载 作者:IT王子 更新时间:2023-10-28 23:36:56 26 4
gpt4 key购买 nike

标题可能令人困惑。假设 str 是一个由 malloc 分配的指针。 ptr,类型为 int*,被分配给它并被释放,如下面的代码片段所示:

char* str = malloc(64);
int* ptr = str;

free(ptr);

我试图编译上面的代码。它只是给出一个警告:

source_file.c: In function ‘main’:
source_file.c:10:16: warning: initialization from incompatible pointer type
int* ptr = str;
^

上面的代码是否调用了未定义的行为?
上面的代码片段是否释放了 mallocstr 分配的内存?

最佳答案

Does the above code invoke Undefined Behavior?

视情况而定。

来自 C11 草案 6.3.2.3/7:

A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned) for the referenced type, the behavior is undefined.

由于 char 的对齐方式可能与 int 不同,这可能限制较少,将 char * pc 分配给int * pi 可能会导致 pi 未对齐。

但是对于 OP 给出的具体示例:

char * pc = malloc(64);
int * pi = pc;

行为将被定义为(参见 Alter Mann comment)malloc() 保证返回正确对齐的内存块。

来自 C11 草案 7.22.3:

The pointer returned [by aligned_alloc, calloc, malloc, and realloc] if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object with a fundamental alignment requirement ...

由于未对齐而导致未定义行为的示例是:

char * pc = malloc(64);
int * pi = pc + 1;

Does the above code snippet free the memory allocated by malloc for str?

如果以前的分配会引入未定义的行为,这个问题是无关紧要的,因为已经调用了 UB 可能会发生任何事情。

如果之前的赋值不会调用 UB,那么对 free() 的调用将完美地释放所引用的内存块,因为将指针值从 int 转换回*void *,最初由 malloc() 提供,定义明确。

来自 C11 草案 6.3.2.3/7(续):

Otherwise, when converted back again, the result shall compare equal to the original pointer

来自 C11 草案 6.3.2.3/1:

A pointer to void may be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer

关于c - 释放分配给 char* (由 `malloc` 分配)的 int* 是否会调用未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30000240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com