1

有 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

4 回答 4

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]);是未定义的行为。

于 2012-09-16T11:33:02.007 回答
5

如果在数组初始化中省略了初始化器,则相应的位置用 初始化0。所以这里所有丢失的char指针都用0. 试图取消引用这些空指针会使您的程序崩溃。

如果这对您的教授来说是意外的行为,如果您只是从黑板上复制错误,或者是否有其他错误,我不知道。

于 2012-09-16T11:32:18.327 回答
1

位置 8 及以后被初始化为 0(NULL 指针),参见例如C 讲义的本节strcatNULL指针未定义,将导致许多常见系统上的分段错误,或者在您的情况下,在访问冲突读取位置strcat尝试读取在零地址。

于 2012-09-16T11:34:50.080 回答
0

考试题是:如果input=2,函数的结果是什么?

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

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

  • 编辑: OP 已被编辑,因此不再是这种情况。您发布的功能根本不使用该input参数。所以它的作用和结果(对于 result 的任何定义独立于参数。

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

  • 编辑: OP 已被编辑,因此不再是这种情况,但如果参数为 2 至于评论,它仍然是正确的。如果strcat引用标准库函数,则该函数保证会发生段错误,因为该函数最终会在第二个参数为 NULL 时调用它。

  • 即使该函数由于某种原因没有段错误,也不清楚结果是什么意思。就副作用而言,该函数可能会将一些内容打印到标准输出。就返回值而言,该函数将返回一个整数,但缺少 return 语句就无法知道该整数是什么。它实际上是一个取决于实现的随机值。

于 2012-09-16T11:57:06.307 回答