有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时犯了错误?
答案 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语句,无法知道该整数是什么。它实际上是一个随机值,取决于实现。