【问题标题】:Segmentation fault (core dumped), working with dynamic vectors分段错误(核心转储),使用动态向量
【发布时间】:2017-01-17 21:24:58
【问题描述】:

package.c:

double * foo(int length) {

int i;
double * a;

a = malloc(sizeof(double) * length)

for(i = 0; i < length; i++ ) {
     a[i] = 0.0;
}

return a;
}

main.c

int main(void) {
    int i;
    double * vector;

    vector = foo(999999);

    for(i =0;i < 999999; i++) {
         printf("%f", vector[i]);
    }

    return 0
}

我的代码有什么问题?我遇到了分段错误(核心转储),我的动态向量总是包含超过 1m 的元素。

【问题讨论】:

  • 我相信它是动态的。 :)
  • 你在混用length和x吗?
  • 您知道malloc 会失败吗?那么它会返回一个空指针吗?当您访问空指针时,您认为会发生什么?请阅读undefined behavior。
  • 你的主文件应该有foo()的声明。如果foo 写在某个头文件中,请包含该特定头文件。
  • 你也应该在退出前释放内存。

标签: c pointers segmentation-fault


【解决方案1】:

您的主文件不包含foo 的声明。所以编译器假定声明是int foo(),即一个接受未知数量参数并返回int的函数。

编译时你应该得到类似这样的警告:

warning: implicit declaration of function ‘foo’
warning: assignment makes pointer from integer without a cast

因此,未正确捕获返回值,导致 undefined behavior,在本例中表现为核心转储。

向 main 添加一个原型,这应该可以修复错误。

double * foo(int length);

int main(void) {
   ...

您还应该在 main.c 中 #include &lt;stdio.h&gt; 和 package.c 和 main.c 中的 #include &lt;stdlib.h&gt; 分别获得 printf 和 malloc 的原型。

另外,不要忘记在程序结束时free(vector) 来清理分配的内存。

【讨论】:

  • 这提醒了我,我们会不会早点看到#include "package.c"?
  • 我已经导入了所需的库和原型,我的问题是:
  • 我在 package.c 中创建了一个动态向量,为什么我无法访问 main.c 中的任何元素?
  • @user5693 我们无法相信你,除非你向我们展示完整的代码 (AKA MCVE)
  • @user5693 我测试了您的代码,有无此答案中的声明。没有它,程序核心就会转储。有了它,它就成功运行了。因此,将double * foo(int length); 添加到 main 的顶部,它将起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2021-06-03
相关资源
最近更新 更多