【问题标题】:malloc a specific pointer from a array of pointersmalloc 来自指针数组的特定指针
【发布时间】:2019-11-22 12:37:34
【问题描述】:

简而言之,我的问题只是理解为什么要使用此代码:

int main() {
    typedef int* ASElement;
    int zero = 0;
    int one = 1;
    int two = 2;
    int three = 3;
    ASElement *elements = (int**)malloc(4 * sizeof(ASElement));
    *elements = (int*)malloc(4*sizeof(int));
    *(elements) = &zero;
    *(*(elements+1)) = one; //segementation fault here


    printf("%d", *(*(elements+1)));



    return 0;
}

不工作?

【问题讨论】:

  • *(*(elements+1)) = one; elements+1 指向什么?
  • *(elements) = &zero; *elements 和*(elements) 是相同的。你打算做什么?也许*(*(elements)) = zero
  • @Blaze - 我已经在指针数组 - 元素上分配了第一个指针(*elements+0),以使用 malloc 指向数组的开头,所以,不应该 *(* (elements+1)) 是该数组的第一项的值吗?
  • @Ctx 不应该 *(elements) = &zero 简单地将 *(elements) 数组的第一项设为零?
  • @TomerAttali 怎么可能?右边是一个绝对不为零的地址。

标签: c pointers malloc


【解决方案1】:

您的程序,如所写,uses the contents at address elements+1 uninitialized,当它执行*(elements+1)。你以前从未在那个地址写过,它在malloc分配的块内,所以它包含的值是不确定的,你不能使用这个值。

您观察到的崩溃可以通过以下事实来解释:当您执行程序时,该内存位置的内容没有形成有效的指针。也许内容是零,也许是一个数字,它碰巧不是您的程序的有效地址。你很幸运:程序可能没有崩溃。

也许你打算写:

*(elements+1) = &one;

https://taas.trust-in-soft.com/tsnippet/t/cb539105

【讨论】:

  • 直截了当:*elements = (int*)malloc(4*sizeof(int)); - 在这里,我在 int 指针数组中分配了第一个指针,指向由 malloc 分配的大小为 4 的块。 *(*(elements+1)) = one - 在这里,不应该简单地将数组 *(elements+0) 中第一项的值分配给第一个吗?
  • elements+1是一个地址,第一次调用malloc分配的数组第二个元素的地址。你从来没有写过这个地址,但是你读过它。然后,您取消引用您已阅读的内容。这不能顺利进行。我不确定您要做什么,但它不能涉及读取未初始化的数组元素并访问它们所代表的地址。
  • *(elements + 1) 是一个未初始化的值。 *(*(elements+1))=…; 使用未初始化的值作为写入地址。
  • 知道了,非常感谢!我的取消引用逻辑有缺陷。 *((*elements)+1) = one; 是我要做的。
  • @TomerAttali 我很高兴听到这个消息。不要犹豫,在 Tsn-p 服务中验证您的程序,它旨在每次检测所有未定义的行为,这比依靠崩溃来发现错误更有帮助(那是“你很幸运:程序可能没有崩溃。”我回答的一部分)。例如,根据您建议的更改,代码会增加变量zero 的地址,从而产生一个无效地址,当您写入它时不会使您的程序崩溃:taas.trust-in-soft.com/tsnippet/t/c12c3e8a
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2012-03-14
  • 1970-01-01
  • 2012-04-18
  • 2012-04-29
相关资源
最近更新 更多