【发布时间】: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