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

时间:2014-09-06 21:39:16

标签: c gcc

好的,我知道我的标题可能有点令人困惑,但我会解释。我正在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]);
}

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

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