【问题标题】:The address of double pointer is deleted after assign some variable [duplicate]分配一些变量后,双指针的地址被删除[重复]
【发布时间】:2019-11-20 13:33:44
【问题描述】:

分配双指针后我遇到了一个有趣的问题。

int **bucket;
bucket = (int **)malloc(sizeof(int) * 10);

我创建了一个双指针没有任何问题,我还创建了一个单指针。

int *size;
size = (int *)malloc(sizeof(int) * 10);

在第一个循环中,我分配了bucket 的每个元素,第二个循环,我为size 的每个元素分配了零。

for (i = 0; i < 10; i++)
    *(bucket + i) = (int *)malloc(sizeof(int) * 1);
for (i = 0; i < 10; i++)
    size[i] = 0;

当我对大小进行分配操作时,它会删除存储桶中某些元素的地址。这里是我调试时的截图。

在这个阶段我还没有进入第二个循环:

这是在我进入第二个循环之后:

什么会导致这个问题?有什么想法吗?

【问题讨论】:

  • sizeof(int) != sizeof(int*)

标签: c pointers segmentation-fault


【解决方案1】:

我看到的问题是

bucket = (int **)malloc(sizeof(int) * 10);

应该是

bucket = malloc (sizeof(*bucket) * 10);  // take the size from the target variable itself

如果在您的平台中,sizeof (int*) 小于 sizeof(int),您最终会在访问 bucket 时出现内存溢出,从而调用未定义的行为。

注意事项:

  1. No need to cast the return value of malloc() and family.
  2. 最好不要使用硬编码类型进行大小计算。

【讨论】:

  • 如果我不在变量前面使用强制转换,它不会让我编译。自从我上大学以来,我就使用了这个约定,我在上面写道。他们是这样表现的。这就是为什么我感到困惑
  • 感谢您的帮助
  • @KaanTahaKöken:“如果我不在变量前面使用强制转换,它不会让我编译。”那么你就不要使用符合标准的 C 编译器,也许是 C++ 编译器?
猜你喜欢
  • 2020-12-30
  • 1970-01-01
  • 2021-01-18
  • 2018-02-05
  • 2020-09-25
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多