首页 > 解决方案 > 树莓派上的结构分段错误gcc

问题描述

我正在努力尝试在 RPI2b 上运行的少量 C 代码。

该代码是关于创建一个包含具有动态大小的整数数组的结构。

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

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

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

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

使用 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);
}

标签: carraysgccstructmalloc

解决方案


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

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

应该:

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

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


推荐阅读