【问题标题】:Is this code snippet not recommend or wrong, and why这个代码片段是不推荐还是错误的,为什么
【发布时间】: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 进行转换。

标签: c pointers memory


【解决方案1】:

是的,它是 100% 安全的。对齐没问题,因为 malloc 结果总是对齐的。因此,您只需将指针保存在分配内存的开头即可。

它也没有 (IMO) 违反严格的别名规则

https://godbolt.org/z/p_8jrP

【讨论】:

  • 哇,我喜欢你粘贴的网站。酷。
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2016-09-23
  • 2016-10-25
  • 2012-01-18
相关资源
最近更新 更多