好的,我知道我的标题可能有点令人困惑,但我会解释。我正在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创建一个数组,但是在程序运行时我一直遇到分段错误: - /。是否可以将a
初始化为数组而不更改原始.c文件中的任何内容,但init(set_t *a, int N)
的实现除外?
修改
这是我当前的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]);
}
答案 0 :(得分:4)
目前的情况是,强加给你的要求是完全不合理的。如果你只构建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良好编码实践的嘲弄。
答案 1 :(得分:0)
教授意识到他在作业中犯了一个错误并修复了它。已将set_t a
更改为set_a *a
。
感谢您的帮助(希望我没有引起太多麻烦!