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; 
} 

我失去的东西,或者是虚拟机可能是什么问题?

+2

'printf(sizeof(hello));'不是你如何打印一个数字。 'printf'将使用该数字作为'char *',这很可能导致分段错误。我很惊讶你的编译器没有警告你。 – Biffen

+0

......不,这与它在VM中运行无关。 (非常好奇你是如何得出这个结论的。) – Biffen

+1

在使用它们或者怀疑操作系统之前,阅读你使用的标准函数的手册页是一个好主意。虚拟机将会对应用程序代码产生影响。这是使用它的基本思想。 – Olaf

您只需仔细阅读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