【问题标题】:Pointer of array never seg fault?数组指针永远不会出现段错误?
【发布时间】:2019-04-07 09:09:48
【问题描述】:

我有一些不明白的地方。

这是我的工作:

float* test = (float*) malloc(4 * sizeof(float) );

然后我试着做

test[100] = 1.0;
printf("%f\n",test[100]);

而且……它奏效了……

我在等待分段错误,但没有,我不明白为什么。 我想这样做以验证我的数组是否已正确分配。 我真的没想到,也许我错过了什么,所以我在互联网上搜索,似乎每个人都得到了一个段错误...... 所以特地过来问问。 谢谢

【问题讨论】:

  • 您所做的事情会导致未定义的行为,包括有时没有段错误...
  • 首先请选择您实际使用的编程语言。C 和 C++ 是两种截然不同的语言。其次,请阅读how to ask good questions,以及this question checklist。当然,请尝试创建Minimal, Complete, and Verifiable Example 向我们展示。然后编辑您的问题以改进它,例如告诉我们为什么您预计会发生崩溃。
  • 这个问题与 C 和 C++ 都有关,不是吗?
  • 要验证您的数组是否正确分配,请检查if ( test == NULL )(或相反)
  • 一些程序员老兄很抱歉,我的问题没有以最好的方式提出,我在火车上,只能通过手机访问互联网。实际上我的问题涉及 C 和 C++,这就是我标记它们的原因。我将 g++ 与 .cpp 文件一起使用,但我主要在其中编写 C 代码。我的其余代码与我的问题无关,我为测试这种行为所做的唯一事情就是我在这里写的。我 malloc 一个包含 4 个浮点数的数组,然后请求第 100 个浮点数,这就是为什么我预计会出现段错误。

标签: c++ c pointers malloc


【解决方案1】:

您造成的是未定义的行为 - 在这种情况下,它按预期工作,但以任何方式依赖它都是一个糟糕的主意:编译器优化或更改操作系统可能会突然导致“奇怪”行为。您应该阅读有关此主题的更多信息,但简而言之,由于未定义的行为,编译器可以为所欲为。

我没有足够的知识来确定,但我假设您的操作系统为您的程序准备了整个内存页面。在 Linux 中默认为 4 KiB,您访问的字节数最多为 400,因此仍有足够的空间。因此,您可能正在访问为您的程序分配的内存,因为操作系统使用不小于 4 KiB 的内存块。

【讨论】:

  • tehftw 感谢它帮助我了解更多,我很想知道它是如何工作的以及为什么它是一个未定义的行为,因为我们正在谈论一个简单的数组,但我想我差不多明白了为什么我没有段错误。
  • @Celhim“我们正在谈论一个简单的数组”您的代码中没有数组。 “我很想知道它究竟是如何工作的,以及为什么它是一种未定义的行为” 什么是有效的?使用test[100] = foo;,您正在尝试写入不属于您的程序的内存。事实上,内存位置test + 100(或:(char*)test + 100 * sizeof(float))可以在任何地方,但您没有读取或写入该内存位置的业务。
  • @Celhim 另外,在 C 中不要转换 malloc() 的结果,在 C++ 中使用 std::vector<>(或 new/new[],如果你是自虐型人格)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多