【问题标题】:struct segmentation fault gcc on raspberry pi树莓派上的结构分段错误gcc
【发布时间】:2018-11-19 09:14:52
【问题描述】:

我正在为尝试在 RPI2b 上运行的少量 C 代码而苦苦挣扎。

代码是关于创建一个结构体,其中包含一个动态大小的整数数组。

结构文件必须在我的主函数中声明为指针。

这是因为:我的程序的更大目的是通过使用 pthread 并行执行三个数组迭代。

据我所知 pthread 在函数调用中需要一个指针。 我不想通过使用 pthread 来改变任何东西(永远不要改变获胜的团队)。

这是我的代码截图应该做的:

  • 定义一个 STEP 编号
  • 声明一个具有已定义 STEP 数量的静态 int 数组
  • 声明一个包含动态数组的结构
  • 填满静态int数组
  • 为动态数组分配内存
  • 用静态 int 数组的值填充动态数组
  • 在控制台上打印两者

使用 gcc 编译时没有错误!

问题在于,在为动态数组程序分配内存时,只是在控制台上显示“分段错误”。

有趣的事实是:我已将整个代码复制粘贴到 Visual Studio 2017,它工作得非常好!

这是我的代码:

#include<stdio.h>
#include<stdlib.h>

#define STEPS 50 //defined steps

typedef struct file File;

struct file {
    int type;
    int* array; //dynamic array
};

int main(void) {
    int i = 0;
    int mainarray[STEPS] = { 0 };
    struct file *f = (File*)malloc(sizeof(File)); //allocate memory for struct

    printf("Fill up static array\n");
    for (i = 0; i <= STEPS; i++) {
        mainarray[i] = i;
    }
    printf("static array values:\n");
    for (i = 0; i <= STEPS; i++) {
        printf("%d\n", mainarray[i]);
    }
    printf("allocate memory for dynamic array\n");
    f->array = (int*)malloc(sizeof(int) * STEPS); //Here I receive my segmentation fault
    if (f->array == NULL) {
        printf("allocating error\n");
    }

    for (i = 0; i <= STEPS; i++) {
        f->array[i] = 20000 * mainarray[i];
    }

    printf("compare of arrays\n");

    for (i = 0; i <= STEPS; i++) {
        printf("i:=\t%d\tMainarray:\t%d\tStructarray:\t%d\t\n", i, mainarray[i], f->array[i]);
    }
    free(f->array);
    free(f);
}

【问题讨论】:

  • 您显然知道 C 中的数组索引是从零开始的(即从零开始)。但正因为如此,对于一系列例如STEPS 元素,可能的 max 索引是多少?
  • 另外说明,为什么要为结构动态分配内存?
  • 动态分配:感谢回复!我的目的的另一点是,在最终版本中,步骤数将取决于加载到代码中的外部文件。因此,STEPS 的数量会有所不同(不应该被设置为我现在看到的#define。对不起!)

标签: c arrays gcc struct malloc


【解决方案1】:

您的问题是(请参阅 Some Programmer Dude 的评论)您超出了数组的范围。这会导致未定义的行为,在您的情况下会导致段错误。

for (i = 0; i <= STEPS; i++) 

应该是:

for (i = 0; i < STEPS; i++) 

因为STEPS-1最后一个有效的数组元素。

【讨论】:

  • 谢谢!现在完美运行!刚刚用 STEPS-1 替换了 STEPS(即使在分配中)。
  • 还有一个问题:为什么反之不行?当我尝试将 for 循环运行到 STEPS 并分配 (STEPS+1) 时,我将继续收到分段错误...
  • 你不想去STEPS-1 你希望你的条件是i &lt; STEPS。这就是我们通常在 C 中这样做的方式。至于您的问题:那么所有内容都需要大小为 STEPS+1,以 mainarray[STEPS+1] 开头。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2021-07-22
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多