c - 树莓派上的结构分段错误gcc
问题描述
我正在努力尝试在 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);
}
解决方案
您的问题是(请参阅 Some Programmer Dude 的评论)您超出了数组的范围。这会导致未定义的行为,在您的情况下会导致段错误。
for (i = 0; i <= STEPS; i++)
应该:
for (i = 0; i < STEPS; i++)
因为STEPS-1
是最后一个有效的数组元素。