将非指针变量转换为指向数组的指针

好吧,我知道我的标题可能有点令人困惑,但我会解释。 我正在C中完成一项家庭作业。我给了一个.c文件,需要为某些函数提供实现。

简而言之,我将此作为.c文件

typedef int set_t; ... void init(set_t *a, int N); // Initialized an array to a of size N ... int main() { set_t a; init(&a, 10); } 

在我提出的几个实现中,我能够使用a创建一个数组,但是在程序运行时我不断出现分段错误: – /。 除了init(set_t *a, int N)的实现之外,是否可以在不更改原始.c文件中的任何内容的情况下将 a初始化为数组?

编辑

这是我当前的init实现 – >它会导致分段错误

 void init(set_t *a, int N) { //set_t thing[10]; *a = malloc(sizeof(set_t)*N); for (int i = 0; i < N; i++) { *(a + i) = i; } printf("value of a[2] = %d\n", a[2]); } 

就目前的情况而言,强加给你的要求是完全不合理的。 如果你只构建32位,那么sizeof(int) == sizeof(int *) ,那么你可以使用残酷的转换来绕过约束。 但是代码不能在64位机器上运行(除非sizeof(int) == sizeof(int *) ,这在我能立即想到的任何机器上都不是这样。

因此,蛮力和铸造技术是:

 void init(set_t *a, int N) { assert(sizeof(set_t) == sizeof(set_t *)); // Ick, but necessary! set_t *base = malloc(sizeof(set_t)*N); if (base == 0) *a = 0; else { *a = (int)base; // Brutal; non-portable; stupid; necessary by the rules given! for (int i = 0; i < N; i++) { base[i] = i; printf("value of a[2] = %d\n", base[2]); printf("value of a[2] = %d\n", ((int *)*a)[2]); // Brutal and stupid too } } 

此外,在main()的代码中,你必须使用((int *)a)使类型可用于解除引用等。不知道其他代码实际上是什么,就不可能有信心什么都行不通。 它可能,但它可能不会。

在这个阶段,这看起来像有人在犯罪上误导无辜的新手程序员。 这根本不是应该编码的方式。 但是,如果那是医生(教授)的命令,那就是你要做的事情。 但这是对AFAICS和AFAIAC良好编码实践的嘲弄。

教授意识到他在作业中犯了一个错误并修复了它。 将set_t a更改为set_a *a

感谢您的帮助(希望我没有引起太多麻烦!