Kali Linux VM中的C分段错误
问题描述:
我正在尝试在使用char数组的Linux VM中创建C程序。我发现每次我尝试对数组做任何事情时,例如sizeof()
,我得到了分段错误。我写了一个测试程序,只是做了一个数组,并得到sizeof()
作为测试,果然我得到了同样的错误。 我认为这与在VM中运行的程序有关。下面是代码:Kali Linux VM中的C分段错误
#include <stdio.h>
#include <stdlib.h>
#define ARR_LENGTH(x) sizeof(x)/sizeof(x[0])
int main()
{
printf("Hllo world!\n");
int sent = 10;
char hello[] = {'a','b','c','d','e','f','g','h'};
printf(sizeof(hello));
printf(ARR_LENGTH(hello));
return 0;
}
我失去的东西,或者是虚拟机可能是什么问题?
答
您只需仔细阅读printf()
文档。它不会把整数作为第一个参数。
有问题的行是:
printf(sizeof(hello));
printf(ARR_LENGTH(hello));
它应该是:
printf("%zu\n", sizeof(hello));
printf("%zu\n", ARR_LENGTH(hello));
(%zu
是格式说明打印size_t
值)。
我gcc编译产生警告:
警告:传递 '的printf' 的参数1时将整数 指针,未作施放[-Wint转换]
那些两个语句。提高编译器的警告级别(如果你没有使用它们)。
+0
这并不能解决我原来的代码,但它修复了这个问题中的代码,所以我会接受它。有用的知道,无论如何:)谢谢! – dodo
'printf(sizeof(hello));'不是你如何打印一个数字。 'printf'将使用该数字作为'char *',这很可能导致分段错误。我很惊讶你的编译器没有警告你。 – Biffen
......不,这与它在VM中运行无关。 (非常好奇你是如何得出这个结论的。) – Biffen
在使用它们或者怀疑操作系统之前,阅读你使用的标准函数的手册页是一个好主意。虚拟机将会对应用程序代码产生影响。这是使用它的基本思想。 – Olaf