【发布时间】:2020-03-08 01:18:44
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main() {
const int N = 20;
char* ptr0 = (char*)malloc(sizeof(char*)*N);
*(char**)(ptr0) = ptr0; //is this line ok?
free(ptr0);
return 0;
}
我只是想知道,第 6 行代码 *(char**)(ptr0) = ptr0 会导致崩溃或错误结果,因此不建议写,还是可以?
【问题讨论】:
-
是的,没关系。与
*(char**)的类型双关不违反严格别名规则,因为指针属于同一类型且指针类型为char。它与int a = 5; a = a;相同(很奇怪,但很好)注意:您的分配比char *ptr0 = malloc (sizeof ptr0 * N);更好(您可以获得N指针的存储空间——这可能比你需要的存储空间多8 倍——但这取决于你) 并查看:Do I cast the result of malloc? -
@DavidC.Rankin 写入 malloc 空间绝不是严格的别名违规
-
@DavidC.Rankin 我阅读了您粘贴的相关问题和答案,让我知道,在纯 C 中,对于我粘贴的代码,没有必要将
void*转换为char*。但是,我已经在 gcc 5.4 和 Visual Studio 2017 中测试了test.c作为文件名。 VS2017 会报错,默认警告/错误级别设置。我想编写 gcc 和 Visual Studio 都可以编译的代码,因此我一直在为 malloc 进行转换。