12个元素数组,仅初始化为7个

时间:2012-09-16 11:26:44

标签: c arrays

有12个元素* prim数组,初始化只有7个元素。这是代码:

int f(int input)
{
    char *prim[12] = {"2", "3", "5", "7", "11", "13", "17"};
    int i;

    for(i=0; i<12; i++)
    {       
        if(i % input == 0)
        {
            strcat(result, prim[i]);
            strcat(result, " ");
        }
    }

    if(strlen(result) == 0)
    {
        printf("return -1");
    }
    else 
    {
        printf("%s\n", result);
        printf("return 0");
    }
}

当i = 8时,调试器会给我一个访问冲突读取位置。

我的朋友在他大学的编程基础课程中给了我这个考试样本,我需要帮他传递它。

所以,我的问题是:有没有我不知道的关于C语言编程的东西,或者教授在声明* prim时犯了错误?

4 个答案:

答案 0 :(得分:6)

char *prim[12] = {"2", "3", "5", "7", "11", "13", "17"};

其余五个元素使用空指针进行初始化,就像声明:

一样
char *prim[12] = {"2", "3", "5", "7", "11", "13", "17", 0, 0, 0, 0, 0};

使用空指针参数调用strcat(result, prim[i]);是未定义的行为。

答案 1 :(得分:5)

如果在数组初始化中省略了初始值设定项,则使用0初始化相应的位置。所以这里所有丢失的char指针都用0初始化。尝试解除引用这些空指针会使程序崩溃。

如果这是你教授的意外行为,如果你只是从黑板上复制错误,或者是否有其他错误,我无法知道。

答案 2 :(得分:1)

位置8及以后被初始化为0(空指针),参见例如 this section 的C讲义,strcat指针NULL未定义,会导致许多常见系统出现分段错误,或者在访问违规读取位置strcat尝试读取零地址。

答案 3 :(得分:0)

考试中的问题是:如果输入= 2,函数的结果是什么?

这里有一些非常可疑的东西(这可能是整个考试的重点)。

无论如何,这是我的观察:

  • 编辑:OP已被编辑,因此不再是这种情况。您发布的功能根本不使用input参数。那么它的作用和结果(对于 result 的任何定义)都与参数无关。

  • 声明该函数返回int,但没有返回语句。任何体面的编译器都会给你至少一个警告。

  • 编辑:OP已被编辑,所以情况不再如此,但如果参数为2,那么它仍然是正确的。如果{的话,该函数保证为段错误{1}}引用标准库函数,因为函数最终使用第二个参数为NULL来调用它。

  • 即使该函数由于某种原因没有出现段错误,也不清楚 result 的含义。在副作用方面,该功能可以将一些内容打印到标准输出。在术语或返回值中,函数将返回一个整数,但缺少return语句,无法知道该整数是什么。它实际上是一个随机值,取决于实现。